And*_*ock 193 asp.net-mvc renderpartial
我有一个页面:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
Run Code Online (Sandbox Code Playgroud)
在其上,以下内容:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Run Code Online (Sandbox Code Playgroud)
这是DTO对象:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是部分:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Run Code Online (Sandbox Code Playgroud)
当Model.Tasks不为null时,一切正常.但是当它为null时,我得到:
传递到字典中的模型项的类型为'DTOSearchResults',但此字典需要类型为'System.Collections.Generic.IEnumerable`1 [Task]'的模型项.
我认为它一定不知道使用哪个重载,所以我这样做(见下文)是明确的,但我仍然得到同样的问题!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过检查null,或者甚至不传递null来解决这个问题,但这不是重点.为什么会这样?
mea*_*ode 341
安德鲁我认为你得到的问题是RenderPartial方法的结果,当你传递的模型为null时,使用调用(视图)的模型到局部视图.你可以通过这样做来解决这个奇怪的行为:
<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary()); %>
Run Code Online (Sandbox Code Playgroud)
这有帮助吗?
con*_*tor 46
@ myandmycode的答案很好,但稍微短一些
<% Html.RenderPartial("TaskList", new ViewDataDictionary(Model.Tasks)); %>
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为它ViewDataDictionary是持有模型的东西,它可以接受模型作为构造函数参数.这基本上传递了一个"整个"视图数据字典,当然它只包含可能为空的模型.
小智 24
看来,当您传入的Model的属性为null时,MVC会故意恢复为"父"模型.显然,MVC引擎将空模型值解释为使用前一个模型值的意图.
这里稍微详细一点:ASP.NET MVC,强类型视图,局部视图参数故障
Fra*_*n P 20
如果您不想在局部视图中丢失以前的ViewData,可以尝试:
<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%>
Run Code Online (Sandbox Code Playgroud)
Col*_*ame 12
一个解决方案是创建一个像这样的HtmlHelper:
public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, string partialViewName, T model)
{
ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData)
{
Model = model
};
return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData);
}
Run Code Online (Sandbox Code Playgroud)
在Partial<T>(...)之前的匹配Partial(...),从而方便编译时没有歧义错误.
我个人觉得很难理解这种行为 - 似乎很难想象这是设计选择吗?
Jaa*_*aap 11
虽然这已经得到了解答,但我遇到了这个并决定我想为我的项目解决这个问题,而不是解决它new ViewDataDictionary().
我创建了一组扩展方法:https:
//github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
我还添加了一些方法,如果模型为null,则不调用partial ,这将节省很多if语句.
我为Razor创建了它们,但其中一些也应该使用aspx样式视图(使用HelperResult的视图可能不兼容).
扩展方法如下所示:
@* calls the partial with Model = null *@
@Html.PartialOrNull("PartialName", null)
@* does not call the partial if the model is null *@
@Html.PartialOrDiscard("PartialName", null)
Run Code Online (Sandbox Code Playgroud)
还有IEnumerable<object>模型的方法,丢弃的方法也可以用Razor lambda调用,允许你用一些html包装部分结果.
如果你愿意,可以随意使用它们.
| 归档时间: |
|
| 查看次数: |
46917 次 |
| 最近记录: |