DropDownListFor用于验证问题的复杂模型

时间:2012-12-16 21:20:52

标签: c# asp.net-mvc-3 validation razor dropdownlistfor

我在输入表单中有其他字段和下拉列表。他们都很好地验证。即使是没有正确验证前端的两个元素仍然在一个帖子中正确地模型绑定。我不完全确定他们为什么没有验证。这是设置:

视图模型

public class DataVM
{
 //Widgets used, populated from database
 public List<Widget> Widgets { get; set; } 

 //Contains data to populate a dropdown with
 public GenericSelectList Containers { get; set; }

 //This will hold the relation between the widget and container
 //where widget is the local id, and container foreign id
 public List<NestedDictionary> WidgetContainers { get; set; }
}

public class NestedDictionary
{
    [RegularExpression("/^[1-9][0-9]*$/")]
    [Required]//This is not being enforced
    public int? ForeignId { get; set; }

    public int LocalId { get; set; }
}

查看

@for (int i = 0; i < Model.Widgets.Count; i++)
{
 @Html.Hidden("WidgetContainers["+i+"].LocalId", Model.Widgets.ElementAt(i).WidgetId)
 <div>
  <div>
   <span>Container Used</span><hr />
  </div>
  <div class="editor-field">
   @Html.DropDownListFor(
    m => m.WidgetContainers.ElementAt(i).ForeignId,
    new SelectList(
     Model.Containers.Values,
     "Id",
     "DisplayFields",
     0
    ),
    " - Select A Container - "
   )
   <br />@Html.ValidationMessageFor(model => model.WidgetContainers.ElementAt(i).ForeignId)
  </div>
 </div>
}

一切都很好。它是互动的,价值是正确的。发布后,正确的数据将传递到正确的位置。但是,如果没有选择Container,那么帖子就可以了,通过值0。有点不知所措。任何想法为什么验证不适用于客户端?

修改

这是隐藏输入的渲染html和选择元素

隐藏的:

<input id="WidgetContainers_0__LocalId" type="hidden" value="39" name="WidgetContainers[0].LocalId">

选择

<select name="ForeignId" id="ForeignId" class="valid">

显然,select应该定义不同的属性。

编辑#2

如果我使用

m => m.WidgetContainers[i].ForeignId,

然后我得到

<select id="WidgetContainers_0__ForeignId" name="WidgetContainers[0].ForeignId" class="valid">

1 个答案:

答案 0 :(得分:-1)

因为它根本不是空的。如果您希望客户端验证有效,则应允许ForeignId为空而不是0 当你在第一个地方创建DropDown时

new SelectList(
 Model.Containers.Values,
 "Id",
 "DisplayFields",
 0 // Don't set this default value
)