1

私は .net MVC 2.0 を使用しており、カスタム ViewModel オブジェクトを受け取る編集ビューをセットアップしました。ViewModel は、次の 2 つのプロパティを持つクラスです。

// Properties
public Portfolio Portfolio { get; private set; }
public SelectList slSectors { get; private set; }

私の見解では、ポートフォリオ オブジェクトを更新するためのフォームがあります。SelectList が渡されるので、ポートフォリオに関連するセクターのドロップダウン リストを作成できます。ここでは特別なことは何もありません。1.0 で行ったのとまったく同じです。

新しい TextBoxFor および DropDownListFor ヘルパー メソッドを使用すると、問題が発生します。

私は次のように設定しています:

<%= Html.ValidationMessageFor(model => model.Portfolio.SectorID)%>
<%= Html.LabelFor(model => model.Portfolio.SectorID)%>
<%= Html.DropDownListFor(model => model.Portfolio.SectorID, Model.slSectors, new { @class = "selectInput" })%>

<%= Html.ValidationMessageFor(model => model.Portfolio.Title)%>
<%= Html.LabelFor(model => model.Portfolio.Title)%>
<%= Html.TextBoxFor(model => model.Portfolio.Title, new { @class = "textInput" })%>

これらは、次の HTML 出力を (それぞれ) 生成しています。

<span class="field-validation-valid" id="form0_Portfolio_SectorID_validationMessage"></span> 
<label for="Portfolio_SectorID">SectorID</label> 
<select class="selectInput" id="Portfolio_SectorID" name="Portfolio.SectorID"><option selected="selected" value="2">Education</option> 

<span class="field-validation-valid" id="form0_Portfolio_Title_validationMessage"></span> 
<label for="Portfolio_Title">Title</label> 
<input class="textInput" id="Portfolio_Title" name="Portfolio.Title" type="text" value="Portfolio Title" />

name および id 属性には「Portfolio」プレフィックスが付いていることに注意してください。これは、「model.Portfolio.X」から派生しているためだと思います。これは、Edit ActionResult の Controller で Model Binding を適用する機能を妨げているようです。

ActionResult は次のとおりです。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formData)
{
    var portfolio = Repository.GetPortfolio(id);

    if (portfolio == null)
        return RedirectToAction("NotFound");


    try
    {
        UpdateModel(portfolio);
        portfolio.DateUpdated = DateTime.Now;
        Repository.Save();
        return RedirectToAction("Index");
    }
    catch (Exception e)
    {
        ModelState.AddModelError("_Form", e.Message);
    }

    return View(new vmPortfolio(portfolio));

}

(a) "Portfolio" プレフィックスがビューに適用されないようにするか、(b) ModelBinding を存在させて動作させるにはどうすればよいですか。

ありがとう、

マイク

4

0 に答える 0