我的观点中有这段代码:
<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; }
}
当表单发布时,模型状态中存在错误。你可以帮我吗?
确保在视图模型上使用可为空的类型:
[Required]
public int? Type { get; set; }
在您的模型中,您似乎使用了一个不可为空的整数,该整数与您在视图上尝试实现的目标不一致。
还要确保要发布此窗体的控制器操作将视图模型作为操作参数。
在您的模型(或视图模型)中,当您从下拉列表中为其赋值时,如果第一个选择的值是空字符串或 null,则它"应该"触发验证,但需要前往服务器才能完成。 我一直没有成功地在没有先做帖子的情况下获得不显眼的客户端验证。 对所需值使用可为空的字段通常不是一个好主意。 此外,由于您没有使用可为 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)
{
...
}