Asp.net mvc .NET MVC不引人注目的验证和自定义模型绑定器
我有一个简单的MVC网站,可以显示jquery对话框进行编辑。此对话框中有一个文本区域,它接受用户可以输入的以逗号分隔的技能列表。提交后,我的模型活页夹将其转换为列表。这是我的模型活页夹的代码Asp.net mvc .NET MVC不引人注目的验证和自定义模型绑定器,asp.net-mvc,unobtrusive-validation,modelbinder,Asp.net Mvc,Unobtrusive Validation,Modelbinder,我有一个简单的MVC网站,可以显示jquery对话框进行编辑。此对话框中有一个文本区域,它接受用户可以输入的以逗号分隔的技能列表。提交后,我的模型活页夹将其转换为列表。这是我的模型活页夹的代码 public class EditSkillsModelBinder : DefaultModelBinder { protected override void OnModelUpdated(ControllerContext controllerContext,
public class EditSkillsModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
var form = controllerContext.HttpContext.Request.Form;
var skillsAsString = form["SkillsAsString"];
var user = bindingContext.Model as UserEditDetailsModel;
//FOR VALIDATION
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState {Value = valueResult};
if (string.IsNullOrEmpty(skillsAsString))
{
bindingContext.ModelState.AddModelError("Skills", "You must enter at least one skill.");
}
else
{
user.Skills = string.IsNullOrEmpty(skillsAsString) ? new List<string>() : skillsAsString.Split(',').Select(i => i.Trim()).ToList();
}
}
}
这是我部分观点的代码
@using (Ajax.BeginForm("EditUserDetails", new { }, new AjaxOptions { }, new { id = "EditUserDetailsForm" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>UserEditDetailsModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Skills)
</div>
<div class="editor-field">
@Html.TextArea("SkillsAsString", Model.Skills.ToCommaSeparatedString())
@Html.ValidationMessageFor(model => model.Skills)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
@*Enable Client Side Validation*@
<script type="text/javascript">
$(document).ready(function () {
$.validator.unobtrusive.parse("#content_container > form");
});
</script>
我所有的简单验证(如[Required])都是在客户端进行的。模型绑定器验证也可以工作,但是不会显示错误消息。我假设javascript中缺少注册错误的内容,但我无法找出它是什么。任何帮助都将不胜感激。谢谢
下面是问题的屏幕截图
所以我抛弃了不引人注目的东西,我发现我的模型上有一个技能的[必需]属性,这导致了屏幕截图中的验证,而不是我的模型活页夹中的验证 虽然模型绑定不用于验证,但尝试为同一个模型属性混合验证属性和模型绑定可能会导致问题,至少在我尝试将字符串转换为列表的情况下是这样,我正在我的模型活页夹中严格验证,它提供了额外的功能,并且已经开始工作 编辑 我应该补充一点,我放弃了验证属性,转而支持FluentValidation per。它不那么冗长,与客户端验证集成,并且更易于使用