【问题标题】:.NET MVC unobtrusive validation and custom model binder.NET MVC 不显眼的验证和自定义模型绑定器
【发布时间】:2012-05-09 15:12:29
【问题描述】:

我有一个简单的 MVC 网站,它显示一个用于编辑目的的 jquery 对话框。在此对话框中是一个文本区域,它接受用户可以输入的以逗号分隔的技能列表。提交后,我的模型绑定器将其转换为 List。这是我的模型绑定器的代码

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 中遗漏了一些东西来注册错误,但我不知道它是什么。任何帮助,将不胜感激。谢谢。

这是问题的截图

【问题讨论】:

    标签: asp.net-mvc unobtrusive-validation modelbinder


    【解决方案1】:

    所以我放弃了不显眼的东西,我发现我的模型上有一个 [Required] 属性用于技能,这导致屏幕截图中的验证,而不是来自我的模型绑定器的验证。

    虽然模型绑定器不用于验证,但似乎尝试为同一模型属性混合验证属性和模型绑定器会导致问题(至少在我尝试将字符串转换为列表的情况下),因此,我我在我的模型绑定器(提供附加功能)中严格验证,它已经开始工作。

    编辑

    我应该补充一点,我删除了验证属性以支持 this post 的 FluentValidation。它不那么冗长,与客户端验证集成,并且更易于使用。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2012-01-29
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多