我需要服务器端页面渲染(没有请求)外部控制器(我想在控制器外部渲染视图)。
为此,我需要假HttpRequest
来创建ControllerContext
,这样我就可以使用razor.Render()
呈现视图并返回
使用信号器集线器stringWriter.ToString()
到客户端。
所以我用这段代码将partialview渲染为字符串;
public class FakeController : Controller { }
HttpRequest httpRequest = new HttpRequest("", new UriBuilder("http", "localhost", 10654, "/" + "SomeController/SomeAction").Uri.ToString(), "");
var routeData = new RouteData();
routeData.Values.Add("Controller", "SomeController");
routeData.Values.Add("Action", "SomeAction");
StringWriter stringWriter = new StringWriter();
HttpResponse httpResponse = new HttpResponse(stringWriter);
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse);
var _contextWrapper = new HttpContextWrapper(httpContextMock);
var controllerContext = new ControllerContext(new RequestContext(_contextWrapper , routeData), new FakeController());
string filePath = "~/Areas/Site/Views/Shared/SomePartialView.cshtml";
var razor = new RazorView(controllerContext, filePath, null, false, null);
razor.Render(new ViewContext(controllerContext, razor, new ViewDataDictionary(model), new TempDataDictionary(), stringWriter), stringWriter);
return stringWriter.ToString();
此处代码尝试呈现@Html.HiddenFor(m => m.property)
我收到错误;
source : System.Web.WebPages
error : Object reference not set to an instance of an object
但奇怪的是我可以获得@Model.property
值(我的意思是它不是空)以及其他模型属性(似乎只有@ Html.HiddenFor或@ Html.Hidden才是问题)。