странное поведение Html.BeginForm - PullRequest
1 голос
/ 13 января 2012

позволяет создать пустое приложение asp.net mvc 3. код

namespace MvcApplication1.Controllers
{
public class MyModel
{
    public int Id { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return Index1(new MyModel() {Id = 100});
    }
    public ActionResult Index1(MyModel model)
    {
        var nm = new MyModel();
        nm.Id = model.Id + 1;
        return View("test", nm);
    }
}

позволяет создать общий вид с именем test. Код вида

@using MvcApplication1.Controllers
@model MyModel

@if (Model != null)
{
    using (Html.BeginForm("Index1", "Home", FormMethod.Post, new { autocomplete = "off" }))
    {
    <div id="compareQuestions">
        <p>@Model.Id</p>
        @Html.HiddenFor(m => m.Id)
        @Html.TextBoxFor(m => m.Id)
        <input type="submit" value="save"/>
    </div>
    }
}

Когда мы публикуем форму в первый раз, все в порядке, но при перезагрузке после первого сообщения значение в текстовом поле неверное. если мы изменим это значение и сохраним сообщение на контроллере, мы получим модель с неверным значением, но не введем ее. Как это возможно?

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Существует существенная разница между <p>@Model.Id</p> и @Html.HiddenFor(m => m.Id).

При отправке формы POST все значения POST сохраняются в ModelState.
Когда вы используете методы HtmlHelper, они сначала извлекают значение из ModelState. Если ModelState не содержит значения, то он смотрит на фактический m.Id.

Итак, когда вы ПОЛУЧАЕТЕ свою форму в первый раз, ModelState нет. Но как только вы отправляете форму, она сохраняет значения в ModelState, поэтому скрытый ввод использует это значение вместо m.Id.

Если вы хотите ВСЕГДА использовать m.Id, вам необходимо очистить ModelState в вашем контроллере:

public ActionResult Index1(MyModel model)
{
    ModelState.Clear();
    ...
1 голос
/ 13 января 2012

Похоже, это правильное поведение, так как вы написали свой метод действия. В представлении вы отображаете как текстовое поле, так и скрытое поле для одного и того же точного свойства модели.

Таким образом, когда вы увеличиваете Id на 1 во время публикации, вы увеличиваете значение в текстовом поле И в скрытом поле.

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

Другая проблема может заключаться в том, что, поскольку у вас есть 2 разных элемента <input с одинаковыми именами, вы не можете быть уверены, отправит ли форма значение из скрытого поля или текстового поля. Опять же, если эти 2 поля должны иметь разные значения, они должны иметь разные свойства в модели. Если вы хотите, чтобы они всегда имели одно и то же значение, поместите в представление TextBox или Hidden - но не оба.

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