mvc dropdownlistfor未标记为必需,但仍然是必需的

bla*_*kik 20 required asp.net-mvc-3 drop-down-menu

我在cshtml文件中有一个dropdownlist:

var kategorie_wlasna = new SelectList(
  (from z in Model.Kategoria
    where !formReadOnly || z.Id == Model.KategoriaWlasnaId 
      select z), 
  "Id", 
  "Nazwa");
...
@Html.DropDownListFor(
  model => model.KategoriaWlasnaId, 
  kategorie_wlasna,
  "----",
  htmlClassDropDownListDef)
Run Code Online (Sandbox Code Playgroud)

在我的viewModel中,我有没有任何注释的属性为Required:

public long KategoriaWlasnaId { get; set; }
Run Code Online (Sandbox Code Playgroud)

但该领域仍然是必需的.在浏览器中我得到:

<select class="input-validation-error form_object1" data-val="true" data-val-number="The field KategoriaWlasnaId must be a number." data-val-required="The KategoriaWlasnaId field is required." id="KategoriaWlasnaId" name="KategoriaWlasnaId">
  <option value="">-----</option>
  <option value="1227">Wykroczenie</option>
  <option value="1228">Przest?pstwo</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Dar*_*rov 44

这很正常.始终需要值类型.您可以使您的财产可以为空:

public long? KategoriaWlasnaId { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在它将不再需要,如果用户没有在下拉列表中选择任何元素,则其值将是null.如果你想使它成为必需和个性化的消息,你可以使用Required属性来装饰它:

[Required]
public long? KategoriaWlasnaId { get; set; }
Run Code Online (Sandbox Code Playgroud)


cou*_*ben 5

您可以修改默认值,DataAnnotationsModelValidatorProvider以便通过Global.asax.cs在Application_Start方法中添加以下行来不需要值类型:

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelMetadataValidatorProvider());
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Run Code Online (Sandbox Code Playgroud)