Несоответствие идентификатора привязки модели ASP.NET MVC - PullRequest
1 голос
/ 02 февраля 2010

У меня есть вид в MVC 2, где я редактирую «страницу». Страница имеет имя, заголовок и содержание. Контент имеет тип EditableContent, который имеет Width, CssClass и Columns. Столбцы - это список.

Когда я делаю это в представлении:

<%= Html.TextBoxFor(m => m.Name) %>

Выводит следующий HTML:

<input type="text" value="About Page" name="Name" id="Name">

А когда я публикую в действии Edit в ContentController:

/// <summary>
/// Edits the specified form.
/// </summary>
/// <param name="item">The content page.</param>
/// <returns>ActionResult for edit</returns>
[HttpPost]
public ActionResult Edit(Page item)
{
    if (ModelState.IsValid)
    {
    }

    return View(item);
}

Он не может привязать свойство Name к item.Name. Просматривая значения в Request.Form, я вижу параметр Name.

Если я отрисовываю текстовое поле вручную, используя это:

<%= Html.TextBox("item.Name", Model.Name)%>

Значение отлично привязано к экземпляру страницы в действии контроллера.

Я что-то здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2010

Вы должны использовать префиксы для названий моделей.Это изолирует вход для разных моделей.Пример действия

public ActionResult Edit([Bind(Prefix="Page")]Page item)

{...}

при рендеринге ввода

<%= Html.TextBox("Page.Name", Model.Name)%>

Извините, пока не знаю, как это сделать с помощью помощника с лямбда-выражением.

0 голосов
/ 05 февраля 2010

Если ваш параметр метода действия называется item , DefaultModelBinder будет искать item.name , item.title , item.content. ширина и т. д. Если он не может найти в запросе * item. **, он игнорирует префикс item и возвращается к пустому префиксу, ища только имя , title , content.width и т. Д.

Скорее всего, что-то еще в запросе называется item (или * item. **), что приводит к тому, что эта резервная логика не возникает. Если вы хотите применить резервную логику, присвойте параметру параметр [Bind (Prefix = "")], который говорит: «Да, я знаю, что этот параметр был назван item, но притворимся, что его имя на самом деле ''."

0 голосов
/ 02 февраля 2010

Вы пытаетесь ввести полное пространство имен для параметра Page в своем действии? Возможен конфликт имен.

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