C# Asp.NETMVC中视图的编程呈现和传递查询字符串
我能够使用以下代码以编程方式呈现视图:C# Asp.NETMVC中视图的编程呈现和传递查询字符串,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我能够使用以下代码以编程方式呈现视图: public static string RenderViewToString(string controllerName, string viewName, object viewData, RequestContext requestContext) { using (var writer = new StringWriter()) { var route
public static string RenderViewToString(string controllerName, string viewName, object viewData, RequestContext requestContext)
{
using (var writer = new StringWriter())
{
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName);
routeData.Values.Add("SkinSrc", "/portals/_default/skins/_default/no%20skin");
var controllerContext = new ControllerContext(requestContext, new BaseController());
controllerContext.RouteData = routeData;
var razorViewEngine = new RazorViewEngine();
var viewEngineResult = razorViewEngine.FindView(controllerContext, viewName, string.Empty, false);
var viewContext = new ViewContext(controllerContext, viewEngineResult.View, new ViewDataDictionary(viewData), new TempDataDictionary(), writer);
viewEngineResult.View.Render(viewContext, writer);
return writer.GetStringBuilder().ToString();
}
}
但是,我希望SkinSrc应该作为查询字符串在url中使用?SkinSrc=/portals/\u default/skins/\u default/no%20skin
如何才能做到这一点?我在处理电子邮件时遇到了类似的问题,希望能有所帮助:
string htmlMessage = RenderViewToString("NewsBrodcast", newsBrodcastModel);
public static string RenderViewToString(string viewPath, object model, bool partial = false, ViewDataDictionary viewDataDictionary = null)
{
try
{
if (!viewPath.Contains("~/Views/Email"))
{
viewPath = "~/Views/Email/" + viewPath + ".cshtml";
}
// first find the ViewEngine for this view
ViewEngineResult viewEngineResult = null;
if (partial)
viewEngineResult = ViewEngines.Engines.FindPartialView(FakeControllerContext, viewPath);
else
viewEngineResult = ViewEngines.Engines.FindView(FakeControllerContext, viewPath, null);
if (viewEngineResult == null)
throw new FileNotFoundException("View cannot be found.");
if (viewDataDictionary == null)
viewDataDictionary = new ViewDataDictionary();
// get the view and attach the model to view data
var view = viewEngineResult.View;
viewDataDictionary.Model = model;
using (var sw = new StringWriter())
{
var ctx = new ViewContext(FakeControllerContext, view, viewDataDictionary, FakeControllerContext.Controller.TempData, sw);
view.Render(ctx, sw);
return sw.ToString();
}
}
catch (Exception)
{
throw;
}
}
public static HttpContext FakeHttpContext()
{
var httpRequest = new HttpRequest("", "https://example.com/", "");
var stringWriter = new StringWriter();
var httpResponse = new HttpResponse(stringWriter);
var httpContext = new HttpContext(httpRequest, httpResponse);
var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
new HttpStaticObjectsCollection(), 10, true,
HttpCookieMode.AutoDetect,
SessionStateMode.InProc, false);
httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, CallingConventions.Standard,
new[] { typeof(HttpSessionStateContainer) },
null)
.Invoke(new object[] { sessionContainer });
return httpContext;
}
private static HttpContext Ctx => HttpContext.Current ?? FakeHttpContext();
private static ControllerContext _fakeControllerContext;
private static ControllerContext FakeControllerContext
{
get
{
var routeData = new RouteData();
routeData.Values.Add("controller", "Fake");
_fakeControllerContext = new ControllerContext(new HttpContextWrapper(Ctx), routeData, new FakeController());
return _fakeControllerContext;
}
}
private class FakeController : ControllerBase { protected override void ExecuteCore() { } }
非常感谢。但是,您正在使用反射创建新会话。那么,在提出请求时,我的当前会话不会被使用吗?我认为,您可以使用自己的上下文,将FakeControllerContext更改为您自己的上下文。我使用了FakeControllerContext,因为我需要在后台渲染视图,而不需要前端向控制器发出任何请求