【问题标题】:MVC5 Render View (with parameters) as StringMVC5 将视图(带参数)渲染为字符串
【发布时间】:2015-03-21 12:38:53
【问题描述】:

我在 MVC 中看到了很多关于如何将视图呈现为字符串的示例,但如果我的视图有任何参数,我无法让它工作。

例如我写了一封邮件订阅邮件作为视图,我想以mailID作为参数调用视图来获取订阅者详细信息以发送个性化邮件。

假设我有一个名为 Email 的控制器和一个名为 SubscribeMail 的视图,其中有一个名为 mid

的参数

我正在使用以下功能发送电子邮件。不幸的是,它永远不会收到邮件 ID,并且在调试模式下永远不会在视图中遇到断点(假设基于过去的参数它永远不会点击我编写的视图),但发送的电子邮件仍然会在视图内发送 html,只是永远不会收到根据参数传入viewbag的个性化数据。

这是我目前拥有的功能:

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))

这是我试图点击的控制器视图(尽管调试从未到达它):

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();
}

知道如何在电子邮件/邮件订阅视图被击中时改进这一点,但不是通过我制作的方法。

【问题讨论】:

  • Render a view as a string 的可能重复项
  • 不是重复的,我的区别是添加参数。请阅读一个问题,而不是不看半天就试图标记它。虽然我们很欣赏这里垃圾问题的清理,但我们仍然要求您首先尊重每个问题。

标签: c# asp.net asp.net-mvc


【解决方案1】:

重点是RenderViewToString 渲染了一个视图。它没有调用动作。我假设你想要实现的是这样的:

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});

【讨论】:

  • 感谢斯蒂芬,我完全混淆了视图和动作。您是否知道有关如何执行此操作的任何链接?再次感谢。
  • 你想达到什么目的?调用一个动作并将视图的响应作为字符串检索?这有点棘手,因为动作会返回一个动作响应,它可以是视图、重定向、JSON,......如果我需要以字符串(也可能作为动作)检索响应,我将代码移动到业务层(即单独的类),可以从操作调用,也可以从其他代码部分调用。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多