Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC5渲染视图(带参数)作为字符串_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# MVC5渲染视图(带参数)作为字符串

C# MVC5渲染视图(带参数)作为字符串,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我在MVC中看到了许多关于如何将视图呈现为字符串的示例,但是如果我的视图有任何参数,我就无法让它工作 例如,我编写了一封邮件订阅电子邮件作为视图,我想使用mailID作为参数调用该视图,以获取订阅者的详细信息以发送个性化电子邮件 假设我有一个名为Email的控制器和一个名为SubscribeMail的视图,其中有一个名为mid的参数 我正在使用以下功能发送电子邮件。不幸的是,它从未收到邮件ID,并且在调试模式下也从未在视图中点击断点(假设基于参数已过,它从未点击我编写的视图),但发送的电子邮件仍

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

当Email/MailSubscribe视图被点击,但不是通过我所使用的方法,你知道我该如何改进吗。

关键是
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等等。。。如果我需要以字符串(也可能是动作)的形式检索响应,我会将代码移动到业务层(即单独的类),该层可以从动作和其他代码部分调用。
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});