-->

ASP.NET MVC,强类型的视图,局部视图参数故障(ASP.NET MVC, strongly

2019-06-24 05:33发布

如果我有看法,从继承:

System.Web.Mvc.ViewPage<Foo>

其中,foo有一个字符串类型的属性栏
并查看要呈现从继承强类型的局部视图:

System.Web.Mvc.ViewUserControl<string>  

像这样:

Html.RenderPartial("_Bar", Model.Bar);%>

那么,为什么它会抛出这样的:

传递到字典的模型产品类型的“富”
但本词典需要类型的模型项目“System.String”。

当未初始化吧?

更具体的:为什么它传递美孚,它应该通过空?

Answer 1:

作为@Dennis指出,如果模型值为null,它将使用现有的模型与视图。 这样做的原因是为了支持使用只包含部分视图名称,并将它重新使用现有模型的签名调用的局部视图的能力。 在内部,所有的RenderPartial佣工推迟到一个RenderPartialInternal方法。 你说的方法来重用现有模型的方式是在模型(这是只需要一个视图名称的签名一样)一个空值传递。 当你传递一个空值同时含有视图名称和模型对象的签名,你基本上是复制,它只接受视图名称的方法的行为。

这应该可以解决您的问题:

<% Html.RenderPartial( "_Bar", Model.Bar ?? string.Empty ) %>


Answer 2:

看ASP.NET MVC源(HtmlHelper.cs - > RenderPartialInternal方法 - >线258):

...

if (model == null) {
    if (viewData == null) {
        newViewData = new ViewDataDictionary(ViewData);
    }

...

这正是你的情况。 ASP.NET MVC使用的ViewData从ViewContext

更新:

试试这个:

<% Html.RenderPartial("_Bar", Model.Bar ?? "Default" ); %>


Answer 3:

如果你传递null作为模型的RenderPartial,那么它就会查看原始模型,这就是为什么说错误FOO。

你需要确保杆被初始化为空字符串,而不是空。

编辑:@Arnis,看看源代码。 它不会说谎。 您传递null到的RenderPartial的过载。 您还没有经过美孚 。 在内部,系统将使用您的网页ViewContext模型(这是美孚 )当您传递一个空来的RenderPartial。



Answer 4:

虽然这已经回答了,我跑过这个决定,我想解决这个问题,我的项目,而不是围绕它正与“新的ViewDataDictionary()”。

我创建了一组扩展方法: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
我还添加了一些方法没有调用部分如果模型为null,这将节省大量的if语句。

我创建了他们剃须刀,但他们夫妇还应该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)

也有对IEnumerable的模型的方法和丢包的人也可以用剃刀拉姆达,让您有一些HTML包裹部分结果调用。

随意如果你喜欢使用它们。



文章来源: ASP.NET MVC, strongly typed views, partial view parameters glitch