Я использую .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