MVC5渲染视图(带有参数)为字符串 [英] MVC5 Render View (with parameters) as String

查看:108
本文介绍了MVC5渲染视图(带有参数)为字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在MVC中看到很多有关如何将视图呈现为字符串的示例,但是如果我的视图具有任何参数,我都无法使其正常工作.

I have seen many examples in MVC on how to render a view as a string, but I have been unsuccessful in getting it to work if my view has any parameters.

例如,我编写了一个邮件订阅电子邮件作为视图,我想使用mailID作为参数调用该视图,以获得订阅者详细信息以发送个性化电子邮件.

For example I have written a mail subscription email as a view, I want to call the view with a mailID as a parameter to obtain the subscribers details to send a personalised email.

说我有一个名为 Email 的控制器,其内部有一个名为 SubscribeMail 的视图,其参数名为 mid

Say I have a controller called Email and a View inside it called SubscribeMail with a parameter called mid

我正在使用以下功能发送电子邮件.不幸的是,它从未收到邮件ID,并且在调试模式下从未在视图中命中断点(假设基于过去的参数它从未命中我编写的视图),但是发送的电子邮件仍在视图内发送html,只是从未收到根据参数在视图包中传递的个性化数据.

I am using the below function to send the email. Unfortunately it never receives the mail ID and in debugging mode never hits a breakpoint in the view (assuming based on the parameters being past it never hits the view I wrote), yet the sent email still sends the html inside the view, just never receives the personalised data being passed in the viewbag based on the parameters.

这是我目前拥有的功能:

This is the function I currently have:

public static string RenderViewToString(string controllerName, string viewName, object viewData)
{
    var context = HttpContext.Current;
    var contextBase = new HttpContextWrapper(context); 
    var routeData = new RouteData();     
    routeData.Values.Add("controller", controllerName);     

    var controllerContext = new ControllerContext(contextBase,  
                                                  routeData,    
                                                  new EmptyController());

    var razorViewEngine = new RazorViewEngine();
    var razorViewResult = razorViewEngine.FindView(controllerContext,    
                                                   viewName,     
                                                   "",   
                                                   false);

    var writer = new StringWriter();
    var viewContext = new ViewContext(controllerContext, 
                                      razorViewResult.View,              
                                      new ViewDataDictionary(viewData),   
                                      new TempDataDictionary(), 
                                      writer);
    razorViewResult.View.Render(viewContext, writer);

    return writer.ToString();
}

我打给谁:

RenderViewToString("Email","MailSubscribe",new KeyValuePair<string,int>("mid",newSubscription.MailID))

这是我要访问的控制器视图(尽管调试从未达到):

Here is the controller view I am trying to hit (although debugging never reaches it):

public ActionResult MailSubscribe(int mailId)
{
    using (var context = new MyEntities())
    {
        subMail result = context.subMails.FirstOrDefault(x => x.MailID == mailId);
        if (result != null)
        {
            ViewBag.Name = result.FirstName;
        }
    }
    return View();
}

任何想法都可以通过单击Email/MailSubscribe视图来改进,而不是通过我做的方法来解决.

Any idea how I could improve this as the Email/MailSubscribe view is being hit, but not via the method I made.

推荐答案

重点是RenderViewToString呈现视图.它不要求采取任何行动.我假设您要实现的目标是这样的:

The point is that RenderViewToString renders a view. It doesn't call an action. I assume what you want to achieve is something like this:

string name = string.Empty;
using (var context = new MyEntities())
{
    subMail result = context.subMails.FirstOrDefault(x => x.MailID == mailId);
    if (result != null)
    {
        name = result.FirstName;
    }
}
string output = RenderViewToString("Email","MailSubscribe", new { mailId = mailId, Name = name});

这篇关于MVC5渲染视图(带有参数)为字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆