1

ModelBinding の例のほとんどを見てきましたが、探しているものを収集できないようです。

私は…したい:

<%= Html.TextBox("User.FirstName") %>
<%= Html.TextBox("User.LastName") %>

投稿時にこのメソッドにバインドする

public ActionResult Index(UserInputModel input) {}

UserInputModel の場所

public class UserInputModel {
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

慣例では、"InputModel" のないクラス名を使用しますが、BindAttribute で毎回これを指定する必要はありません。

public ActionResult Index([Bind(Prefix="User")]UserInputModel input) {}

DefaultModelBinder をオーバーライドしようとしましたが、この小さな機能を挿入する適切な場所が見つからないようです。

4

2 に答える 2

2

関数に渡されるオブジェクトのModelNameプロパティは、設定したいものです。これを行うモデル バインダーを次に示します。ModelBindingContextBindModel

 public class PrefixedModelBinder : DefaultModelBinder
 {
     public string ModelPrefix
     {
         get;
         set;
     }

     public PrefixedModelBinder(string modelPrefix)
     {
         ModelPrefix = modelPrefix;
     }

     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
     {
         bindingContext.ModelName = ModelPrefix;
         return base.BindModel(controllerContext, bindingContext);
     }
 }

Application_Startあなたのようにそれを登録してください:

ModelBinders.Binders.Add(typeof(MyType), new PrefixedModelBinder("Content"));

Bindこのモデル バインダーを使用して、指定した型の属性を追加する必要がなくなりました。

于 2011-09-10T16:30:46.990 に答える
1

BindAttribute をクラス レベルで使用して、UserInputModel パラメーターのインスタンスごとに重複することを避けることができます。

======編集======

フォームからプレフィックスを削除するか、ビュー モデルで BindAttribute を使用するのが最も簡単なオプションですが、別の方法として、UserInputModel 型のカスタム モデル バインダーを登録し、必要なプレフィックスを明示的に探すこともできます。

于 2010-07-18T07:12:43.617 に答える