Html.TextBoxFor не показывает обновленное значение в действии POST

На мой взгляд, у меня есть

      <%:Html.LabelFor(model => model.IPAddress)%>

    <div class="editor-field">
        <%:Html.TextBoxFor(model => model.IPAddress)%>
        <%:Html.ValidationMessageFor(model => model.IPAddress)%>
    </div>

В моем контроллере (метод post) у меня есть этот

[HttpPost]
public ActionResult Manipulation(MyModel model){
  //I change modele here
  if(something)
    model.IPAddress="100.100.100.100";
  return View(model);
}

Итак, мой вопрос: Когда я меняю модель, TextBoxFor не меняет его значение. TextBoxFor получает его значение, когда я перехожу из метода get к сообщению, и позже я не могу изменить значение TextBoxFor. Я отлаживаю, и моя модель имеет новое значение, но TextBoxFor не показывает новое значение.

Можешь мне помочь?

Ответ 1

Попробуйте:

ModelState.Clear();
return View(model);

Если не результат! вернуть результат JSON, а затем обновить с помощью javascript

Ответ 2

У г-на Грока была аналогичная проблема этого сайта. Он уже нашел решение ModelState.Clear(), но хотел получить объяснение, почему он сработал. Самый высокий рейтинг на связанном сайте предложил, что поведение хелпера html является ошибкой, для которой ModelState.Clear() является обходным путем. Тем не менее, брэдвиллы на этот сайт говорит, что поведение по дизайну и дает следующее объяснение:

Причина, по которой мы используем опубликованное значение для редакторов, а не значение модели, заключается в том, что модель не может содержать значение, введенное пользователем. Представьте себе, что в вашем "int" редакторе пользователь набрал "собаку" . Вы хотите отобразить сообщение об ошибке, в котором говорится, что "собака недействительна" и оставить "собаку" в поле редактора. Тем не менее, ваша модель - это int: она не может хранить "собаку" . Поэтому мы сохраняем старую ценность.

Если вам не нужны старые значения в редакторе, очистите состояние модели. То, где старое значение хранится и вытаскивается из HTML-помощников.

Несмотря на то, что он по дизайну, это очень неожиданное поведение для разработчика, и, к сожалению, взаимодействие с ModelState требуется для общей потребности программирования.

Кроме того, очистка всего ModelState может вызвать непредвиденные проблемы в других областях (я думаю, что касается валидации на несвязанных полях модели). Большое спасибо Питеру Глюку (в комментариях на странице г-на Грокса) за предложение более ограниченного ModelState.Remove( "ключ" ), а для Toby J - для разработки более удобного метода, который работает, когда вы не знаете, какой ключ должен быть, если свойство модели вложено. Мне также нравится метод Tobys, потому что он не зависит от строки в качестве входных данных.

Этот метод с незначительными изменениями следует:

/// <summary>
/// Removes the ModelState entry corresponding to the specified property on the model. Call this when changing
/// Model values on the server after a postback, to prevent ModelState entries from taking precedence.
/// </summary>
/// <param name="model">The viewmodel that was passed in from a view, and which will be returned to a view</param>
/// <param name="propertyFetcher">A lambda expression that selects a property from the viewmodel in which to clear the ModelState information</param>
/// <remarks>
/// Code from Tobi J at /questions/469276/aspnet-mvc-modelstateclear
/// Also see comments by Peter Gluck, Metro Smurf and Proviste
/// Finally, see Bradwils http://forums.asp.net/p/1527149/3687407.aspx.  
/// </remarks>
public static void RemoveStateFor<TModel, TProperty>(
    this ModelStateDictionary modelState, 
    TModel model,
    Expression<Func<TModel, TProperty>> propertyFetcher
) {
    var key = ExpressionHelper.GetExpressionText(propertyFetcher);

    modelState.Remove(key);
}

Ответ 3

Вместо использования привязки модели id предлагает использовать вызов tryupdate.

[HttpPost]
public ActionResult Manipulation(FormCollection formCollection)
{
  MyModel model = new MyModel();

  if(TryUpdate(Model))
  {
      enter code here
  }

  if(somthing)
  model.IPAddress="100.100.100.100";
  return View(model);
}

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

лучшие советы по настройке mpc asp.net

Ответ 4

Вот еще одна работа, которую я нашел. Вместо

@Html.TextBoxFor(m=>m.PropertyName)

сделайте это

@{
var myModel = Model;
}
@Html.TextBoxFor(m=>myModel.PropertyName)

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