После изучения этого вопроса у меня есть объяснение, почему следующий код не действует в действии:
product.ProductName = "This has no effect";
ViewData["ProductName"] = "This has no effect either";
My View использует HTML Helpers:
<% Html.EditorFor(x => x.ProductName);
Помощники HTML используют следующий порядок очередности при поиске ключа:
- Запись словаря ViewData.ModelState
- Свойство модели (если строго типизированное представление. Это свойство является ярлыком для View.ViewData.Model)
- Запись словаря ViewData
Для действий HTTP Post всегда заполняется ModelState, поэтому изменение модели (product.ProductName) или ViewData напрямую (ViewData ["ProductName"]) не имеет никакого эффекта.
Если вам нужно изменить ModelState напрямую, синтаксис для этого:
ModelState.SetModelValue("ProductName", new ValueProviderResult("Your new value", "", CultureInfo.InvariantCulture));
Или очистить значение ModelState:
ModelState.SetModelValue("ProductName", null);
Вы можете создать метод расширения для упрощения синтаксиса:
public static class ModelStateDictionaryExtensions {
public static void SetModelValue(this ModelStateDictionary modelState, string key, object rawValue) {
modelState.SetModelValue(key, new ValueProviderResult(rawValue, String.Empty, CultureInfo.InvariantCulture));
}
}
Тогда вы можете просто написать:
ModelState.SetModelValue("ProductName", "Your new value");
Подробнее см. Потребление данных в представлениях MVC2 .