1

在我看来,我有这段代码:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"type="text/javascript"></script>

...  

    <div class="modal_label">
        @Html.LabelFor(model => model.Organization.Type)
    </div>
    <div class="modal_field">
        @Html.DropDownListFor(model => model.Organization.Type, (IEnumerable<SelectListItem>)ViewBag.TypeList, String.Empty)
        @Html.ValidationMessageFor(model => model.Organization.Type)
    </div>

如果我将@Html.DropDownFor 更改为@Html.EditorFor,则验证工作正常,但在这种情况下,我呈现了以下 html:

 <select id="Organization_Type" name="Organization.Type" class="valid">
 ...
 </select>

这是我的模型:

[MetadataType(typeof(OrganizationMetaData))]
public partial class Organization
{

}

public class OrganizationMetaData
{
    [Required(ErrorMessageResourceType = typeof(CCMESResources.ResourceErrors),ErrorMessageResourceName = "ValueIsRequired")]
    public int Type { get; set; }
}

当表单发布时,ModelState 中有错误。你能帮助我吗?

4

2 回答 2

3

确保您在视图模型上使用了可为空的类型:

[Required]
public int? Type { get; set; }

在您的模型中,您似乎使用了一个不可为空的整数,这与您试图在视图中实现的目标不一致。

还要确保您发布此表单的控制器操作将视图模型作为操作参数。

于 2012-05-01T14:36:34.580 回答
1

在您的模型(或视图模型)中,当您从下拉列表中为其分配一个值时,如果第一个选择的值是空字符串或 null,它“应该”触发验证,但它需要访问服务器去做吧。在没有先发帖的情况下,我无法成功地在客户端进行不显眼的验证。为所需值使用可为空的字段通常不是一个好主意。此外,由于您没有使用可为空的字段,因此在检查模型是否有效时应该强制验证。这是我项目中的一个片段(另外,我正在使用“Min”注释的数据注释扩展):

模型:

[Display(Name = "Ticket Priority")]
[Min(1, ErrorMessage = "You must select a ticket priority.")]
public int TicketPriorityID { get; set; }

看法:

<div class="editor-label">
    @Html.LabelFor(model => model.TicketPriorityID)
</div>
<div class="editor-field">
    @Html.DropDownList("TicketPriorityID", string.Empty)
    @Html.ValidationMessageFor(model => model.TicketPriorityID)
</div>

控制器(HttpGet):

ViewBag.TicketPriorityID = new SelectList(db.TicketPriorities.OrderBy(x => x.TicketPriorityID).ToList(), "TicketPriorityID", "Name");

控制器(HttpPost):

if (ModelState.IsValid)
{
    ...
}
于 2012-05-01T14:46:07.600 回答