Почему не сохраняются изменения значения @Html.LabelFor?

Я новичок в MVC 4, то, что я хочу сделать, это сделать метку, которая отображает целое число приращения

на странице cshtml

@Html.LabelFor(m => m.Increment, Model.Increment)

на странице контроллера

public ActionResult Index(IncrementModel IM){
    IM.Increment ++;
    return View(IM);
}

Начальный результат равен 0, нажмите один, затем увеличьте до 1, затем значение навсегда равно 1, независимо от того, сколько раз я нажимаю.

2 ответа

Решение

LabelFor вспомогательный метод отображает метку, как это.

<label for="Increment">Increment</label>

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

<p>@Model.Increment</p>

Или используя DisplayFor() вспомогательный метод.

@Html.DisplayFor(s=>s.Increment)

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

@using(Html.BeginForm())
{
   @Html.DisplayFor(s=>s.Increment)
   @Html.HiddenFor(s => s.Increment)
   <input type="submit"/>
}

Но теперь также, когда вы публикуете значение, увеличиваете его в методе действия и отправляете обратно, значение поля ввода (скрытое поле) не будет обновляться каждый раз с новым значением. Поскольку ModelStateDictionary имеет некоторое значение для этого свойства, которое является значением после первого обновления. Это значение будет использоваться, когда мы будем рендерить скрытое поле для Increment имущество. Вот почему вы видите 1 как значение, и оно никогда не меняется.

Что вы должны сделать, это явно удалить этот элемент из ModelStateDictionary.

[HttpPost]
public ActionResult Index(IncrementModel IM)
{
    IM.Increment++;
    ModelState.Remove("Increment");
    return View(IM);
}

Метка только для отображения. Это значение не отправляется обратно на сервер. Вместо этого используйте текстовое поле и поместите его в форму.

@Html.TextBoxFor(m => m.Increment);
Другие вопросы по тегам