我试图解决这样一个事实:当他们编写asp.net MVC 3时,他们忘记包含代码来添加不显眼的验证属性到选择列表,他们的"修复"就是将它包含在MVC 4中,这不是血腥的使用MVC 3的任何人.
我建议的解决方法是使用Html.GetUnobtrusiveValidationAttributes()自己添加它们,就像任何其他自定义属性一样,但我无法确定调用方法的正确语法.有2个重载,一个接受一个字符串,另一个接受一个字符串和一个ModelMetaData类.我理解元数据参数,我认为我只是传入ViewData.ModelMetadata但字符串应该是什么?MSDN文档说它是"指定的HTML名称属性",这对我来说毫无意义.HTML名称属性是什么?选择清单?为什么它需要它以及它如何帮助它知道我的模型上我想要验证的属性?查看使用示例,他们似乎都传递了我的模型上属性的名称,我想要验证属性,这是有道理的.不幸的是,无论我传递什么,我都无法让方法返回任何空集合.
我的模型类叫做Event,我的属性叫做EventTypeID.我使用稍微不同的viewmodel类作为视图的基础,因为我需要显示事件列表,并且还允许在同一视图上输入新事件,因此我有一个简单的viewmodel类,如下所示:
public class EventViewModel
{
public Model.Event NewEvent { get; set; }
public IEnumerable<Model.Event> Events { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
下拉列表映射到属性,如:@Html.DropDownListFor(model => model.NewEvent.EventTypeID我将作为字符串传递给Html.GetUnobtrusiveValidationAttributes(string)或Html.GetUnobtrusiveValidationAttributes(string, ModelMetadata)获取此属性的属性.我试过了:
Html.GetUnobtrusiveValidationAttributes("EventTypeID")
Html.GetUnobtrusiveValidationAttributes("EventTypeID",ViewData.ModelMetadata)
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID")
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID",ModelMetadata)
Run Code Online (Sandbox Code Playgroud)
他们都返回一个空集合.
我知道我的模型是正确的,因为如果我将调用更改Html.DropDownListFor为Html.TextBoxFor然后验证"正常工作",除了将验证属性添加到我的模型类之外,我不需要做任何事情.
编辑:
刚尝试关闭客户端验证,验证在所有选择列表的服务器端都很好.
我在 MVC 3 razor 视图中有 2 个下拉列表,如下所示:
@Html.DropDownListFor(m => m.UserGroups, Model.UserGroups.Select(x => new SelectListItem() { Text = x.Name, Value = x.Id }), new { @class="pad5" })
Run Code Online (Sandbox Code Playgroud)
他们工作得很好。我有 3 个改变 -
1) 第一个需要在此列表顶部添加一个新选项。
<option value="">--pick--</option>
Run Code Online (Sandbox Code Playgroud)
2)第二个需要在加载时选择一个特定的选项。假设我想在我的第二个列表中预先选择这个选项。
<option value="100">My Friends</option>
Run Code Online (Sandbox Code Playgroud)
3)两个下拉菜单具有相同的数据源。这导致两个列表在表单上具有相同的名称。如何更改名称?
我可以更改 id,但如果我将其添加到末尾,名称似乎不会更改:
new { @id="ViewGroup", @name="ViewGroup"}
Run Code Online (Sandbox Code Playgroud)