2

私は少し MVC 初心者なので、初歩的な質問であることをご容赦ください。

フォームに複数選択リストを含めるために、カスタム ビューモデルを作成しました。

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 から完全な出力を取得し、それに応じて解析できるようにします。問題は、これはビューモデル用のパラメーターなしのコンストラクターがない (そして存在しない) と不平を言うことです。これを修正する正しい方法がわかりません。私が試したことは何もうまくいかず、本当に助けが必要です!

それが役立つ場合、私のビューは次のようになります。

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

2 に答える 2

1

私はそれを手に入れたと思います:

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;
    }
}

global.asax ファイルの Application_Start() 内のエントリとともに:

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

これにより、リストボックスの選択項目のコンマ区切りリストがフィールドに配置されます。例: 「1,3,4」。

于 2009-05-20T02:03:00.963 に答える
1

カスタム ModelBinder を試しましたか。コードを明確に理解しているかどうかはわかりませんが、これが出発点になる可能性があります。

public class CustomerFormViewModelBinder : DefaultModelBinder
{
    protected virtual object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var model = new CustomerFormViewModel(customer)
    }
}
于 2009-05-19T17:51:33.427 に答える