ASP.NET MVC, может ли контроллер изменять передаваемые значения? - PullRequest
3 голосов
/ 11 марта 2010

разрешено ли в ASP.NET MVC изменять представленные значения?

[HttpPost]
public ActionResult Create(Person toCreate)
{
    toCreate.Lastname = toCreate.Lastname + "-A-";

    return View(toCreate);
}

я пробовал этот код, но ASP.NET MVC продолжает показывать значения, представленные пользователем

[UPDATE]

это:

[HttpPost]
public ActionResult Create(Person toCreate)
{
    return View(new Person { Lastname = "Lennon" });
}

или это:

[HttpPost]
public ActionResult Create(Person toCreate)
{
    return View();
}

по-прежнему показывает значения, введенные пользователем, что заставило меня задуматься, почему сгенерированный код должен генерировать: return View (toCreate) в HttpPost? почему бы просто не вернуть View ()? по крайней мере, это не нарушает ожидания того, что значения могут быть переопределены из контроллера

[ОБНОВЛЕНИЕ: 2010-06-29]

Нашел ответ здесь: ASP.NET MVC: изменение свойств модели при обратной передаче и здесь: Установка значений ModelState в пользовательском связывателе модели

Рабочий код:

[HttpPost]
public ActionResult Create(Person toCreate)
{
    ModelState.Remove("Lastname");
    toCreate.Lastname = toCreate.Lastname + "-A-";
    return View(toCreate);
}

Ответы [ 3 ]

4 голосов
/ 29 июня 2010

По-видимому, нет способа повторно проверить ModelState после изменения значения некоторого ключа. IsValid остается ложным, потому что установка нового значения для некоторого ключа не вызывает повторную проверку.

Решение состоит в том, чтобы сначала удалить ключ, который вызвал IsValid, чтобы быть ложным, воссоздать его и присвоить ему значение. Когда вы сделаете это, ModelState автоматически выполнит повторную проверку и, если все в порядке, IsValid вернет true.

Как это:

bindingContext.ModelState.Remove("Slug");
    bindingContext.ModelState.Add("Slug", new ModelState());
    bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));
0 голосов
/ 11 марта 2010

Если вы используете Html-помощник для визуализации текстовых полей и привязки к вашей модели, например:

<%= Html.TextBox("toCreate.LastName", Model.Person.LastName) %>

Когда страница отображается из POST, по умолчанию помощник отображает значение, которое было отправлено в данных POST. То есть он только использует Model.Person.LastName в первый раз (GET). Обычно это предпочтительный подход, но если вы хотите избежать этого, просто напишите html самостоятельно:

<input type="text" name="toCreate.LastName" value="<%= Html.Encode(Model.Person.LastName)" />
0 голосов
/ 11 марта 2010

да, это разрешено.

Почему в вашем представлении отображаются старые значения, которые я не могу сказать на основе вашего кода. у вас есть доступ

Model.Lastname

в вашем Viewcode в Create.aspx?

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