0

MVC (NerdDinner チュートリアル) の基礎を学ぼうとしています。モデルを定義しました:

public class DinnerFormViewModel
{

    // Properties
    public Dinner Dinner { get; private set; }

    public SelectList Countries { get; private set; }

    // Constructor
    public DinnerFormViewModel(Dinner dinner)
    {
        Dinner = dinner;
        Countries = new SelectList(PhoneValidator.Countries, dinner.Country);
    }
}

そして私は部分的なビューを定義しました:

 @model MyNerddiner.Models.DinnerFormViewModel



 @using (Html.BeginForm()) {
 @Html.ValidationSummary(true)
 <fieldset>
    <legend>Dinner</legend>

    @Html.HiddenFor(model => model.Dinner.DinnerID)
    <div class="editor-label">
        @Html.LabelFor(model => model.Dinner.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Dinner.Title)
        @Html.ValidationMessageFor(model => model.Dinner.Title)
    </div>
</fieldset>
}

これは通常のビューからロードされます:

 @model MyNerddiner.Models.DinnerFormViewModel
 @{
   ViewBag.Title = "Create";
 } 
 <div id="Create" > 
 <h2>Host a Dinner</h2>

   @Html.Partial("_DinnerForm")

 </div>

コントローラー:

public ActionResult Create()
{

    Dinner dinner = new Dinner()
    {
        EventDate = DateTime.Now.AddDays(7)
    };
    return View(new DinnerFormViewModel(dinner));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(DinnerFormViewModel dinnerViewModel)
{
    Dinner dinner = null;
    if (ModelState.IsValid)
    {
        try
        {
            dinner = dinnerViewModel.Dinner;
            UpdateModel(dinner);
            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new { id = dinner.DinnerID });
        }
        catch
        {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
            return View(dinner);
        }
    }
    return View(new DinnerFormViewModel(dinner));
}

(ポストバック時に)作成しようとすると、エラーが発生します:

このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。

プログラムがどこかで を開始しようとしていることが原因であると推測できますが、どこDinnerFormViewModelで、なぜ、どのように正しくする必要がありますか?

4

2 に答える 2

0

MVCフレームワークでは、ビューモデルにパラメーターを受け取らないコンストラクターが必要です。これにより、リクエストからのデータを入力するための空のインスタンスを作成できます。DinnerFormViewModelは、パラメーターのないコンストラクターを実装していません。パラメーターを追加すると、問題が修正されます。

于 2012-07-17T19:28:24.407 に答える
0

さて、問題が見つかりました。それはモデルとコンストラクターとは何の関係もありません。

問題は、ビューに次の行が含まれていたことです: @Html.DropDownListFor(model => model.Countries, Model.Countries) @Html.ValidationMessageFor(model => model.Countries)国の値が null でした。

model => model.Countries を model => model.Dinner.Country に変更した後

例外がスローされなくなりました

自力で解決できてよかったです!

于 2012-07-18T20:11:03.913 に答える