C# 使用不同模型渲染强类型局部视图

C# 使用不同模型渲染强类型局部视图,c#,asp.net,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc 3,Razor,我有两种看法: 1) Register–用于创建用户帐户的主视图 2) Category–用于动态添加类别的部分视图(如果它不在注册视图组合字段中) 当用户在注册时单击AddCategory时,Category视图显示为jQuery对话框。此视图显示组成新类别(如名称和说明)所需的字段。因此,它有一个单独的模型 在get页面上,一切正常,但是在post上,如果出现一些验证错误,页面需要重新加载用户提供程序值以进行更正,而不是抛出以下错误: 异常详细信息:System.InvalidOperati

我有两种看法: 1) Register–用于创建用户帐户的主视图 2) Category–用于动态添加类别的部分视图(如果它不在注册视图组合字段中)

当用户在注册时单击AddCategory时,Category视图显示为jQuery对话框。此视图显示组成新类别(如名称和说明)所需的字段。因此,它有一个单独的模型

在get页面上,一切正常,但是在post上,如果出现一些验证错误,页面需要重新加载用户提供程序值以进行更正,而不是抛出以下错误:

异常详细信息:System.InvalidOperationException:传递到字典的模型项的类型为'Delight.Models.User',但此字典需要'Delight.Models.Category'类型的模型项

我认为使用以下语句可能会导致此问题(因为它没有指定用于局部视图的模型对象):

然而,采用以下过载方法也无法解决问题:

@Html.Partial("CreateCat", null, null)
上面的第二个参数(具有空值)表示模型对象

然而,以下出乎意料地解决了我的问题:

@Html.Partial("CreateCat", new Category(), null)
为什么在这种情况下空对象可以工作,而null不能


是否有其他更好的方法来渲染具有不同模型类型的强类型局部视图。

除非要使用父级模型或无模型,否则应始终为局部视图传递适当的模型。传入null是愚蠢的,如果您不想在局部视图中使用实例化的模型,那么为什么局部视图会使用模型呢?在本例中,我认为new Category()是正确的选择。然而,我总是看到子模型被传递到partials中

@Html.Partial("CreateCat", Model.Category)

关于需要做你正在做的事情似乎有些奇怪,但我不确定你是如何使用局部视图的。

我认为这不是MVC模式应该使用的方式。。。也许您的部分视图应该集成到您的页面中,或者在单独的页面上?@Jeremy我没有其他选择。该类别是通过ajax添加的,我不想为用户打开一个新的浏览器窗口。实际上,它永远不需要任何回发数据。顺便问一下,MVC有什么问题?MVC难道不应该让我们对如何构造不同的组件有更多的控制吗?因为如果你把一个空对象传递给一个视图,它就会崩溃(如果你不先检查一个空模型的话)。调用Html.Partial(“CreateCat”)传递父模型(Models.User)。我想用new Category()调用它本质上就是在返回一个空的、要创建的新类别时控制器所做的事情。编辑:我可能在这方面错了,因为我是MVC新手,但这是我所理解的。听起来你的添加类别方法应该是ajax调用,而不是局部视图。在DOM中唯一需要更改的是向组合框中添加另一个选项,对吗?jQuery post变量应该与CategoryAdd模型匹配,并且应该返回一个JsonResult,描述将下拉项添加到DOM并使选择值可使用所需的任何信息。@Jeremy这正是我正在做的。为了使代码更清晰,我将该类别划分为一个局部视图。部分视图仅在加载整页时呈现(隐藏)。当用户单击添加链接(在类别组合之前)时,它将显示为一个对话框。用户指定名称和描述,并通过ajax发布,对话框消失,新的categoryId+名称被附加到原始组合中。我需要部分视图,因为类别本身是一个单独的模型(尽管很小),具有类似stringlength之类的验证器。正如我在评论(见上文)中所说,尽管这可以通过打开一个新的浏览器窗口来实现(以避免局部视图),我想让它与jquery对话框和html一起工作,以获得平滑的用户体验。Model.Category对我来说看起来不错,但我认为我可以坚持我的解决方案,因为我说过在整个页面加载期间,Category视图将始终为空。谢谢你的回答。我不同意“总是为局部视图传递适当的模型”。例如,我的部分视图是生成MemberID DropDownList,视图的模型肯定是“Members”。它可以通过@model关键字在视图顶部声明模型。
@Html.Partial("CreateCat", Model.Category)