vấn đề với tất cả các giải pháp trên được rằng họ không phải là thread an toàn !.
nếu bạn muốn hiển thị chế độ xem từ một chuỗi khác thì sao? (Cho thư điện tử)
trong trường hợp đó ControllerContext là không còn phù hợp cũng không phải này Controller
cho những trường hợp này tôi đề nghị các giải pháp sau đây:
ThreadPool.QueueUserWorkItem(_ =>
{
var model = new TestMailModel() { Sender = "yakirmanor", Recipient = "[email protected]", Description = "some desc" };
string test1 = ControllerExtensions.RenderView("Mail", "TestMail", model);
string test2 = this.RenderView("TestMail", model);
string test3 = this.RenderView(model);
// now send the mail
//MailHelper.SendEmail("[email protected]", "subject", test1, "username", "password");
});
đây bạn có thể thấy tôi gọi TestMail trong bộ điều khiển Mail và cũng là TestMail trong bộ điều khiển hiện tại.
để tạo ra các extansions
public static class ControllerExtensions
{
public static string RenderView(this Controller controller, object model)
{
string viewName = controller.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = controller.ControllerContext.RouteData.Values["controller"].ToString();
return RenderView(controllerName, viewName, model);
}
public static string RenderView(this Controller controller, string viewName, object model)
{
string controllerName = controller.ControllerContext.RouteData.Values["controller"].ToString();
return RenderView(controllerName, viewName, model);
}
public static string RenderView(string controllerName, string viewName, object viewData)
{
//Create memory writer
var writer = new StringWriter();
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName);
//Create fake http context to render the view
var fakeRequest = new HttpRequest(null, "http://tempuri.org", null);
var fakeResponse = new HttpResponse(null);
var fakeContext = new HttpContext(fakeRequest, fakeResponse);
var fakeControllerContext = new ControllerContext(new HttpContextWrapper(fakeContext), routeData, new FakeController());
var razorViewEngine = new RazorViewEngine();
var razorViewResult = razorViewEngine.FindView(fakeControllerContext,viewName,"",false);
var viewContext = new ViewContext(fakeControllerContext, razorViewResult.View, new ViewDataDictionary(viewData), new TempDataDictionary(), writer);
razorViewResult.View.Render(viewContext, writer);
return writer.ToString();
}
}
sử dụng mã bạn cần phải thêm mô hình của bạn và bộ điều khiển giả
public class TestMailModel
{
public string Sender { get; set; }
public string Recipient { get; set; }
public string Description { get; set; }
}
class FakeController : ControllerBase
{
protected override void ExecuteCore() { }
}
quan điểm có thể trông giống như vậy:
@model Phytech.PhyToWeb.Controllers.TestMailModel
@{
Layout = null;
}
<table cellpadding="8" cellspacing="0" style="width: 100%!important; background: #ffffff; margin: 0; padding: 0" border="0">
<tbody><tr><td valign="top">
Hi @Model.Recipient youve got mail from @Model.Sender about @Model.Description
</td></tr></tbody>
</table>
bản sao có thể có của [Hiển thị chế độ xem dưới dạng chuỗi] (http: //stackoverflow.com/questions/483091/render-a-view-as-a-string) – jrummell
Nhận xét trong đề xuất trùng lặp đề cập đến phương pháp đó không hoạt động trong MVC 3 và "Cách tốt hơn để đồng hành với điều này ngay bây giờ" – stephen776