我有一个非常大的用户档案模型。大约有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="">
我该如何解决这个问题?我的想法:
对此情况的任何想法都非常感谢。我对ASP.NET MVC有些新意。
答案 0 :(得分:1)
您的视图模型应包含定义用户类别的属性(pehaps为枚举), 然后在你的视图中只渲染适用于该类别的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);
答案 1 :(得分:0)
老实说,我会放弃在服务器技术中构建这样一个野兽的想法,转而使用普通的JS,KnockoutJS或AngularJS,它们似乎是为满足这种需求而精确构建的。 但是,回答你的问题:
您必须记住,浏览器仅向服务器提交已启用的文件。如果你不想“混淆”服务器,只需在提交前禁用不需要的字段。
asp.net mvc的模型绑定器按名称属性而不是id查找值。您可以使用具有不同id属性的couple字段和所有这些字段的一个名称的表单。在Razor View中声明它们会稍微复杂一点,但它应该可以工作。