Подход ViewModel мешает ModelBinding в MVC 2 при использовании новых помощников HTML «Для» - PullRequest
1 голос
/ 04 февраля 2010

Я использую .net MVC 2.0 и настроил представление редактирования, которое получает пользовательский объект ViewModel. ViewModel - это класс с двумя свойствами:

// 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.

Результат действия выглядит следующим образом:

[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));

}

Как можно (а) остановить использование префикса «Портфолио» в представлении или (б) заставить ModelBinding работать с ним.

Спасибо

Mike

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...