0

私のカスタムモデルの検証では、次のものがあります。

 public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){
        var repository = DependencyResolver.Current.GetService(typeof(IContactRepository));
        IContactRepository repo = repository as IContactRepository;
        USRContact c = repo.GetContactByID(Convert.ToInt64(bindingContext.ValueProvider.GetValue("ContactID").AttemptedValue));
        c.FormalName = bindingContext.ValueProvider.GetValue("FormalName").AttemptedValue;

        if (!repo.IsValidFormalName(c.ContactID, c.FormalName))
        {
            var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            bindingContext.ModelState.AddModelError("FormalName", Resources.ErrorMsgs.FormalNameNotUnique);

            return bindingContext.Model;
        }

        c.PreferredName = bindingContext.ValueProvider.GetValue("PreferredName").AttemptedValue;
        c.Alias = bindingContext.ValueProvider.GetValue("Alias").AttemptedValue;
        c.Pseudonym = bindingContext.ValueProvider.GetValue("Pseudonym").AttemptedValue;
        c.GenderID = Convert.ToInt32(bindingContext.ValueProvider.GetValue("GenderID").AttemptedValue);
        c.NationalityID = Convert.ToInt32(bindingContext.ValueProvider.GetValue("NationalityID").AttemptedValue);
        c.ModifiedByID = Utilities.SessionUtil.Current.UserID;
        c.ModifiedDate = DateTime.Now;

}

私のコントローラーは、次のようにしてこのモデル バインダーを呼び出します。

public ActionResult Update([ModelBinder(typeof(ModelBinder.ContactModelBinder))] USR.USRContact contact)
    {
        if (ModelState.IsValid)
        {
            repository.Update();
            return View("~/Views/Shared/Contacts/ShowContactInfo.cshtml", repository.GetContactByID(contact.ContactID));
        }
}

}

私のビューモデルには、正式な名前が必要であり、そのエイリアスは 60 文字未満である必要があることを示すデータ注釈が含まれています。モデル バインダーがそれを永続データ モデル (USRContact) に変換し、ビューがビューモデルを予期している場合、エラーを表示するにはどうすればよいですか?

ビュー モデルで検証エラーが発生した場合、コントローラーが永続データ モデルに変換されないようにする方法はありますか? データ オブジェクト内のすべてのモデル エラーをチェックして検証エラーを見つけたとしても、エラーが発生したテキスト ボックスの横にあるエラーが表示されたビューにユーザーを戻すにはどうすればよいでしょうか。

助けてくれてありがとう!サフリス

4

1 に答える 1

0

あなたが直面している可能性がある問題は、カスタムバインダーを介してこれらの値を他のオブジェクトにプッシュすると、それらがページ上にあったものと同じではなくなることだと思います。

Html.ValidationFor(x=>x.PropertyValue) を持つ "PropertyValue" というプロパティは、PropertyValue を持つアイテムの ModelState エラー コレクションを調べます。

それらを Contact にプッシュすると、値は Contact.PropertyValue になります。検証した場合は、「Contact.PropertyValue」として ModelState に追加されます。これは、Html.ValidationFor(x=>x.Contact.PropertyValue) によってのみ取得されます。

最も簡単な解決策は、入力と出力が同じ構造に従っていることを確認することです。アイテムを Html.TextBoxFor(x=>x.Contact.SomeProperty) としてレンダリングできる場合は、問題ありません。

于 2013-03-22T19:37:40.040 に答える