我的观点中有这个代码:
<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中存在ARE错误。你能救我吗?
答案 0 :(得分:3)
确保您在视图模型上使用了可为空的类型:
[Required]
public int? Type { get; set; }
在你的模型中,你似乎使用了一个不可为空的整数,这个整数与你想要在视图上实现的结果不一致。
还要确保您正在POST此表单的控制器操作将视图模型作为操作参数。
答案 1 :(得分:1)
在您的模型(或视图模型)中,当您从下拉列表中为其指定值时,如果第一个选定的值为空字符串或为null,则“应该”触发验证,但它将需要一次旅行到服务器去做。我没有成功地在没有先发帖子的情况下在客户端工作时进行不显眼的验证。将可空字段用于所需值通常不是一个好主意。此外,因为您没有使用可空字段,所以当您检查模型是否有效时,它应强制进行验证。这是我的项目中的一个片段(也是,我使用data annotation extensions作为“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>
Controller(HttpGet):
ViewBag.TicketPriorityID = new SelectList(db.TicketPriorities.OrderBy(x => x.TicketPriorityID).ToList(), "TicketPriorityID", "Name");
控制器(HttpPost):
if (ModelState.IsValid)
{
...
}