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