2010-07-28 101 views
1

我没有在我的MVC应用程序中使用“模型绑定” - 也就是说,我没有尝试过将表单输入映射到Action参数列表中的一个或多个类,在许多地方描述的方式。相反,我只是发送每个单独的表单字段的参数,或使用FormCollection。MVC模型绑定混淆

我在想我可能会尝试这个,但我对基本前提感到困惑。看起来这个想法是,你使用相同的模型来进行ViewModel(从Controller到View)的“绑定”(从View到Controller)。 (我为每个视图使用强类型视图和单独的ViewModel。)

但是,我发现我的View的需求与我的Action的需求完全不同 - 例如,视图可能需要用户可以从中选择几个SelectLists。但是,Action只需要知道用户选择了哪些项目,而不是每个列表中的所有选项。

真的习惯使用同一个班同时进行两个方向吗?

例如,这里是我的ViewModel类之一:

public class IntervieweeSelectLists 
{ 
    public SelectList intervieweesList { get; set; }    
    public ClientSelectLists districtFilterLists { get; set; } 
    public SchoolDisplayListInfo schoolListDisplay { get; set; } 
    public long selectedIntervieweeID { get; set; }    
    public string selectedIntervieweeName { get; set; }   
    public string selectedSiteID { get; set; }     
    public bool needsInterviewList { get; set; }     
    public bool needsClientSelectLists { get; set; }   
} 

(再加上有一些方法等)

通过查看需要的这个类,但并非所有的它是需要的行动 - 即,intervieweesList,districtFilterLists,needsInviewview等

我想我的问题是:如果我要写一个自定义模型绑定器绑定此类,我将不得不重新创建整个类模型联编程序,包括SelectLists,内容其中来自数据库,当我真正需要的是用户选择的东西?或者我会设置这个类的现有实例中的所有值,从View中发送到模型联编程序?

对不起,如果这是不连贯的......我的理解在这里丢失了一些东西。帮帮我! :)

回答

1

我只会重新创建那些在模型活页夹上有意义的属性。必须从数据库填充SelectListItems是一个巨大的开销,如果属性值不会用于(通常发生)您的操作,除非服务器端出现一些错误,在这种情况下,您需要重新创建整个ViewModel - 显示视图。

1

您不需要自定义模型活页夹。当您在控制器操作中返回IntervieweeSelectLists时,您的列表将为空,因为从帖子传回的数据不会包含该信息。所以你有一个对象,它有空列表所需的答案。现在让我们说一些事情没有验证,你需要再次显示所有的列表。那么控制器动作知道何时将显示此模型,以便只在模型传递到视图中时才需要填充列表。如果您不需要将模型传递到视图中,并仅存储结果,因为不需要填充列表。

+0

那么,我正在考虑自定义模型绑定器的原因是,当我尝试将上述类放入Action的参数列表中时,即使Model.IsValid为空,所有字段都返回null(或默认值)真正。它看起来像是默认的模型绑定器无法解决它。但可能是因为我没有遵循字段的正确命名约定。 – Cynthia 2010-07-28 15:53:52

+0

好的,当我尝试更改HTML字段名称以匹配类中的内容时,我正在获取值(进度!)。然而,返回的一些字段被埋在类的较低层中 - 即,所选区属性在区域过滤列表对象内。它根本没有选择 - districtFilterLists为空。所以我想我需要一个自定义模型构建器 - 或者彻底改变我的ViewModel类。但是,谢谢,我觉得我终于到了某个地方。我没有同事 - 我是整个IT部门。 - 所以我需要有人来反弹创意。 – Cynthia 2010-07-28 16:09:07

+0

听起来像您正在手动编写您的HTML。您应该使用DisplayFor和EditFor html帮助程序为您创建html。他们会自动为您创建名称。我强烈建议在http://www.asp.net上检查ASP.Net MVC演示。 (Model.IsValid只是验证,如果你没有验证数据注释,那么该属性默认是有效的) – 2010-07-28 18:39:38