2009-05-19 10 views
2

私はMVCの初心者ですから、私が想像しているのは基本的な質問です。 MVCカスタムビューモデルの問題

は、私は自分のフォームで複数選択リストを持っているために、カスタムのviewmodelを作成しました:私は私の最初の試みは、唯一の複数選択の最初の値をキャプチャことがわかっ

public class CustomerFormViewModel 
{ 
    public Customer Customer { get; private set; } 
    public MultiSelectList CustomerType { get; private set; } 

    public CustomerFormViewModel(Customer customer) 
    { 
     Customer = customer 
     // this returns a MultiSelectList: 
     CustomerType = CustomerOptions.Get_CustomerTypes(null); 
    } 
} 

、と私は、これは私のためであると推測しましたアクションを作成するには、このように見えた:だから

// GET: /Buyer/Create 
    public ActionResult Create() { ... } 

    // POST: /Buyer/Create 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Customer customer) { ... } 

、私はこれにそれを変更することを決めた:

// GET: /Buyer/Create 
    public ActionResult Create() { ... } 

    // POST: /Buyer/Create 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(CustomerFormViewModel model) { ... } 

私はMultiSelectListから完全な出力を取得し、それに応じて解析することができます。問題は、これはviewmodelのパラメータのないコンストラクタがないことです(それはありません)。これを修正する正しい方法はわかりません。私が試したことはありませんでした。本当に助けが必要です!

ことができます場合は、私の見解は次のようになります。

<%@ Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MySite.Controllers.CustomerFormViewModel>" %> 
... 
<% using (Html.BeginForm()) 
    <%= Html.ListBox("CustomerType", Model.CustomerType)%> 
... 

答えて

1

私はそれを得たと考えている:Global.asaxファイルののApplication_Startのエントリとともに

public class CustomerModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var form = controllerContext.HttpContext.Request.Form; 

     Customer customer = base.BindModel(controllerContext, bindingContext) as Customer; 

     if (customer!= null) 
     { 
      customer.CustomerType= form["CustomerType"]; 
     } 

     return customer; 
    } 
} 

() :

 ModelBinders.Binders.Add(typeof(Customer), new CustomerModelBinder()); 

リストボックス選択のコンマ区切りリストをフィールドに入れます。例えば"1,3,4"。

1

はカスタムModelBinderを試してみました。わからない私ははっきりとあなたのコードを理解していますが、これはあなたの出発点のようになります。

public class CustomerFormViewModelBinder : DefaultModelBinder 
{ 
    protected virtual object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     var model = new CustomerFormViewModel(customer) 
    } 
} 
+0

いくつかの調査をして、あなたが言うように、カスタムモデルバインダーはまさに私が必要とするものだと結論づけました。今私はちょうど1つを書く方法を理解する必要があります! ご意見ありがとうございます - 私はあなたの提案を取って、私はそれを動作させることができるかどうかを確認します。 – user101306