我没有在我的MVC应用程序中使用“模型绑定” - 也就是说,我没有尝试将表单输入“映射”到Action参数列表中的一个或多个类,方式是在许多地方描述过。相反,我只是为每个单独的表单字段发送参数,或使用FormCollection。
我在想我可能会尝试这个,但我对基本前提感到困惑。似乎你的想法是你使用相同的模型进行你的ViewModel(从Controller到View)的“绑定”(从View到Controller)。 (我使用强类型视图,每个视图都有一个单独的ViewModel。)
然而,我发现我的View的需求与我的Action的需求完全不同 - 例如,View可能需要几个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; }
}
(另外还有一些方法等)
View需要此类,但Action并不需要所有这些类 - 即intervieweesList,districtFilterLists,needsInterviewList等。
我想我的问题是:如果我要编写一个自定义模型绑定器来绑定这个类,我是否必须在模型绑定器中重新创建整个类,包括SelectLists,其内容来自数据库,我真正需要的只是用户选择的东西?或者我是否会从此类的现有实例设置所有值,从View?
发送到模型绑定器对不起,如果这是不连贯的......我的理解中缺少一些东西。救命! :)
答案 0 :(得分:1)
我只会重新创建那些在模型绑定器上有意义的属性。必须从数据库填充SelectListItems是一个巨大的开销,如果你的操作不会使用属性值(通常会发生),除非服务器端出现一些错误,在这种情况下你需要重新创建整个ViewModel来重新启动 - 显示视图。
答案 1 :(得分:1)
您不需要自定义模型装订器。当您在控制器操作中返回IntervieweeSelectLists
时,您的列表将为空,因为从帖子传回的数据将不包含该信息。所以你有一个对象,它具有空列表所需的答案。现在让我们说一些事情没有验证,你需要再次显示所有列表。那么控制器动作知道何时将显示该模型,因此只有在将模型传递到视图之前才需要填充列表。如果您不需要将模型传递到视图中,只需存储结果,因为不需要填充列表。