这就是RenderPartial方法的工作方式(我知道应该有文档记录、博客介绍等,但我也觉得这有点奇怪)。如果您没有指定模型或传递null
,它将使用父页面的模型。为了避免这种情况,您可以使用空合并运算符:
<% Html.RenderPartial("Foo", Model.FooBar1 ?? new Foo()); %>
如果你真的很好奇这是如何实现的,以下是ASP.NET MVC 2源代码相关部分的摘录:
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model) {
htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, model, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
}
internal virtual void RenderPartialInternal(string partialViewName, ViewDataDictionary viewData, object model, TextWriter writer, ViewEngineCollection viewEngineCollection) {
if (String.IsNullOrEmpty(partialViewName)) {
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");
}
ViewDataDictionary newViewData = null;
if (model == null) {
if (viewData == null) {
newViewData = new ViewDataDictionary(ViewData);
}
else {
newViewData = new ViewDataDictionary(viewData);
}
}
else {
if (viewData == null) {
newViewData = new ViewDataDictionary(model);
}
else {
newViewData = new ViewDataDictionary(viewData) { Model = model };
}
}
ViewContext newViewContext = new ViewContext(ViewContext, ViewContext.View, newViewData, ViewContext.TempData, writer);
IView view = FindPartialView(newViewContext, partialViewName, viewEngineCollection);
view.Render(newViewContext, writer);
}
注意如何处理空模型的情况。