4

編集目的でjqueryダイアログを表示する単純なMVCWebサイトがあります。このダイアログには、ユーザーが入力できるスキルのコンマ区切りリストを受け入れるテキストエリアがあります。提出すると、私のモデルバインダーはこれをリストに変換します。これが私のモデルバインダーのコードです

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>

[必須]などの私の単純な検証はすべて、クライアント側で機能します。モデルバインダーの検証も機能しますが、エラーメッセージは表示されません。エラーを登録するためのJavaScriptに何かが欠けていると思いますが、それが何であるかわかりません。どんな助けでもいただければ幸いです。ありがとう。

これが問題のスクリーンショットです

ここに画像の説明を入力してください

4

1 に答える 1

2

そこで、目立たないように捨てました。モデルバインダーからの検証ではなく、スクリーンショットで検証を引き起こしているスキルのモデルに[必須]属性があることがわかりました。

モデルバインダーは検証を目的としていませんが、同じモデルプロパティに対して検証属性とモデルバインダーを混在させると問題が発生するようです(少なくとも文字列をリストに変換しようとする場合)。したがって、厳密に検証しています。私のモデルバインダー(追加機能を提供します)で、動作を開始しました。

編集

この投稿ごとにFluentValidationを優先して検証属性を削除したことを追加する必要があります。冗長性がはるかに低く、クライアント検証と統合され、使いやすくなっています。

于 2012-05-17T12:29:06.477 に答える