ASP.NET MVC 中相同模型数据的多个输入字段
Posted
技术标签:
【中文标题】ASP.NET MVC 中相同模型数据的多个输入字段【英文标题】:Multiple input fields for the same model data in ASP.NET MVC 【发布时间】:2014-05-18 08:44:39 【问题描述】:我有一个非常大的用户配置文件模型。大约有 15 种不同的新用户类别(例如,年轻旅行者、经验丰富的旅行者、船长、舵手……)。根据用户类别,模型的某些数据字段不适用,在数据库中保留null
。
我正在尝试通过一个大型注册表单来填充模型。 javascript 根据用户之前的回答确定用户类别,并在表单中显示/隐藏适用/不适用的输入字段。
出现以下问题:
根据用户类别,我需要在表单中以稍微不同的顺序显示一些输入字段。我通过为视图中的同一数据字段(例如,@html.TextBoxFor(x => x.Age)
)创建多个输入字段,然后根据用户类别使用 JavaScript 仅显示一个来解决此问题。
我的计划是只提交可见的输入字段,这样服务器就不会混淆使用哪些输入字段来创建模型。
不幸的是,Visual Studio 并不能很好地发挥作用:首先,存在多个输入字段具有相同 id
的问题;我也许可以忍受。但是,HTML 源代码中的验证属性仅针对视图中每个数据字段的第一次出现(例如,@Html.TextBoxFor(x => x.Age)
)生成,而不是以后的任何出现。
例如,第一次出现
<input data-val="true" data-val-number="The field Age must be a number."
data-val-range="The field Age must be between 10 and 99." data-val-range-max="99"
data-val-range-min="10" id="Age" name="Age" type="text" value="">
第二次仅生成
<input id="Age" name="Age" type="text" value="">
我该如何解决这个问题?我的想法:
在视图的开头创建一次隐藏的所有输入字段,并使用 Javascript 在表单中动态生成。缺点:工作量很大,所有页面结构现在都在 JavaScript 中而不是视图中。 为不同的用户类别使用部分视图。缺点:打开表单页面时(在控制器中),我从数据库中检索几个列表并将它们放入模型中,以便在视图中填充表单 DropDown 输入字段和 RadioButton 输入列表。有没有办法在部分视图中重用这些信息,从而减少重复的数据库查询?非常感谢您对这种情况的任何想法。我对 ASP.NET MVC 有点陌生。
【问题讨论】:
【参考方案1】:您的视图模型应该包含一个定义您的用户类别的属性(可能是一个枚举), 然后在您看来,只需呈现适用于该类别的 html
/// Some common html
@if (model.UserCategory == "captain")
// controls specific to captain
else if (model.UserCategory = "helmsman")
// controls specific to helmsman
如果您需要在确定“先前答案”的同一页面上包含此 html,请将其放在部分视图中,并使用 ajax(传递用户类别)。
另一种选择是为每个属性只创建一个控件,然后在隐藏该控件的 javascript 中,同时禁用该控件 - 禁用的控件不会回发,因此该属性将保持为空
$('#MyProperty').prop('disabled', true);
【讨论】:
【参考方案2】:老实说,我会放弃在服务器技术中构建这样一个野兽的想法,转而使用普通的 JS、KnockoutJS 或 AngularJS,它们似乎正是为这种需求而构建的。 但是,回答您的问题:
您必须记住,浏览器仅将那些已启用的文件提交给服务器。如果您不想“混淆”服务器,请在提交之前禁用不需要的字段。
asp.net mvc 的模型绑定器按名称属性而不是 id 查找值。您可以使用具有不同 id 属性和一个名称的几个字段的表单。在 Razor 视图中声明它们会稍微复杂一些,但它应该可以工作。
【讨论】:
以上是关于ASP.NET MVC 中相同模型数据的多个输入字段的主要内容,如果未能解决你的问题,请参考以下文章
将表数据映射到 asp .Net MVC 中的 ViewModel 列表
(Asp.Net MVC / Web-Api)中具有相同身份验证系统的多个项目