0

私は MVC3 が初めてで、2 日間読んだ後、自分が間違っていることを見つけることができません。シナリオは次のとおりです。

私は強く型付けされたビューを持っています:

<%@ Page Title="" Language="C#" 
MasterPageFile="~/Views/Shared/NestedMasterPage.Master"    
Inherits="System.Web.Mvc.ViewPage<AdminToolMVC.Models.PageModels.MembershipVM>" %>

<% using (Html.BeginForm("UpdateUser", "Admin")) 
{ %>
   <%: Html.CheckBoxFor(m => m.Tab6VM.Programs[0].Selected, 
      new { id = "prog1" })%>
   <%: Model.Tab6VM.Programs[0].Description %></br>
   <%: Html.CheckBoxFor(m => m.Tab6VM.Programs[1].Selected, 
      new { id = "prog2" })%>
   <%: Model.Tab6VM.Programs[1].Description %></br>
   <%: Html.CheckBoxFor(m => m.Tab6VM.Programs[2].Selected, 
     new { id = "prog3" })%>
   <%: Model.Tab6VM.Programs[2].Description %></br>
   <%: Html.CheckBoxFor(m => m.Tab6VM.Programs[3].Selected, 
     new { id = "prog4" })%>
   <%: Model.Tab6VM.Programs[3].Description %></br>
   <input type="submit" id="btnUpdate"  value="Update"  />
<%} %>

私の管理コントローラーで:

public ActionResult Index()
{
     //return some view
}

[HttpPost]
    public ActionResult UpdateUser(MembershipVM pageModel)  
    {
        UserAdminDW dataWriter;
        Models.PageModels.MembershipVM = 
          new  Models.PageModels.MembershipViewModel();
        try
        {
            model = StateHelper.MEMBERSHIP;
        }
        catch (Exception e)
        {

            return RedirectToAction("SessionExpired", "Error");
        }
    }

強く型付けされたビュー ページは、ユーザーがフォーム内で変更しているデータを AdminController クラスの UpdateUser メソッドに送信する必要があるという印象を受けました。

しかし、代わりに、「このオブジェクトにはパラメーターなしのコンストラクターが定義されていません」というメッセージが表示されます。エラー。

ビュー内からコントローラー呼び出しにパラメーターを追加しようとしましたが、コントローラーに渡されるページ モデルが null です。私がやりたいことは、ユーザー データをページに表示した後、ユーザーが情報の一部を更新し、それをコントローラーに送り返して、データベースに保存できるようにすることだけです。私は何が欠けていますか?私は Razor エンジンを使用しておらず、従来の MVC3 のみを使用しています。助けてくれてありがとう。

4

1 に答える 1

2

このエラーは、モデル バインダーがオブジェクト (ビュー モデル) を設定しようとしていて、パブリック/パラメーターなしのコンストラクターが見つからない場合に発生します (ああ、そうですか?)。

ビューモデル

public class CustomerViewModel {
    public CustomerViewModel() { // <- public constructor without params.
        Created = DateTime.Now;
    }

    public Guid CustomerId { get; set; }
    public DateTime Created { get; set; }
    public AddressViewModel Address { get; set; }
}

public class AddressViewModel {
    public AddressViewModel(Guid customerId) { // <- BOOM! AddressViewModel have none parameterless constructor, so it can't be created
        CustomerId = customerId;
    }        

    public Guid CustomerId { get; set; }
    public string Street { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }

    public CustomerViewModel Customer { get; set; }
}

アクション

[HttpPost]
public ActionResult UpdateCustomer(CustomerViewModel customer) {
    // when modelbinder are trying to create the 'customer', it sees that CustomerViewModel have an AddressViewModel(which have none parameterless constructor) property, and you know what happen.
}

それが役に立てば幸い。

于 2012-10-13T00:08:36.347 に答える