如何防止视图将其模型传递给部分视图,而是传递null?

9
在ASP.NET MVC和使用Razor的情况下,我有一个视图(父级)调用另一个视图(子级)作为部分。两者都是强类型的,但它们具有不同的模型类型。
通常,在这种情况下,我们会从父视图显式地传递一个模型到子视图。
@Html.Partial("Child", Model)

我们还可以选择不明确指定要传递的模型,在这种情况下,父视图将尝试将其自己的模型传递给子视图。如果类型匹配,则此方法有效,并且在大多数情况下都是可取的。
@Html.Partial("Child")

在我的情况下,我真的希望父View不要尝试将任何内容传递给子View。我该怎么办呢? 我想过尝试显式地传递null:
@Html.Partial("Child", null)

但是这样仍然会将父模型传递给子视图,从而导致错误:The model item passed into the dictionary is of type 'A', but this dictionary requires a model item of type 'B'.

(顺便说一句,子视图是其模型的创建视图,这就是为什么我没有要传递给它的实例。)

3个回答

11

试试这个:

@Html.Partial("Child", null, new ViewDataDictionary<ChildType>(childInstance/*this can be null*/))

5

我理解你不想传递模型的原因是为了清空你的输入?如果是这种情况,你可以传递一个新的模型到这个局部视图中:

@Html.Partial("Child", new Model())

由于这个模型是新的,它不会有任何值填充。


1
有点儿。更准确地说,原因是当视图被调用时,在 概念上 并没有那个模型的实例。我感到不舒服,只是为了满足视图引擎而创建和传递一个尚不存在并且可能根本没有提交的模型的实例。 - Theodoros Chatzigiannakis

1
你可以使你的创建表单不是强类型的...为了在发布后绑定模型到你的控制器操作中,可以精心制作你的输入。
现在...对我来说,仅仅为了概念上的微妙之处“模型尚不存在”(也就是还没有在数据库中)而进行这项工作并不值得。
在我的情况下,我只是创建虚拟模型来设置某些字段的默认值(例如:设置今天的日期、下拉列表中的默认值等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接