2013-08-27 5 views
4

У меня есть простой строго типизированный вид, но я не могу обновить текстовое поле в моей форме после сообщения.TextBoxFor значение не обновляется после сообщения

Вот моя модель:

public class Repair 
    { 
    public string Number { get; set; }  
    } 

И на мой взгляд, это TextBox:

@Html.TextBoxFor(x => x.Number) 

Я пытаюсь обновить текстовое поле после того, как пост в мой контроллер:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Index(Repair r) 
     { 

      r.Number = "New Value"; 

      return View(r); 

     } 

Несмотря на то, что я устанавливаю Number в новое значение, текст в текстовом поле не изменяется. Что я делаю не так?

ответ

16

Использование ModelState.Clear() перед установкой значения

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(Repair r) 
{ 
    ModelState.Clear(); //Added here 
    r.Number = "New Value"; 
    return View(r); 
} 
7

Когда вы отправляете модель обратно в ActionResult и возвращаете тот же вид, значения для объектов модели содержатся в ModelState. ModelState - это то, что содержит информацию о действительных/недопустимых полях, а также фактические значения POSTED. Если вы хотите обновить значение модели, вы можете сделать одну из двух вещей:

ModelState.Clear()

или

ModelState["Number"].Value = new ValueProviderResult("New Value", "New Value", CultureInfo.CurrentCulture)

+0

При попытке установить значение ModelState, я получаю эту ошибку: Ошибка \t \t 11 Не удается неявно преобразовать «строка» типа для «» System.Web.Mvc.ValueProviderResult – broke

+0

@broke - был обновлен с правильным синтаксисом , Вот MSDN на ValueProviderResult - http://msdn.microsoft.com/en-us/library/system.web.mvc.valueproviderresult(v=vs.108).aspx. Спасибо за головы! – Tommy

+0

Спасибо за обновление! – broke

3

С моей я считаю, что это связано с ошибкой дизайна в рамках. IMO:

@Html.TextBoxFor(x => x.Number) 

НЕ следует принимать значение от ModelState, а непосредственно из модели. По крайней мере, это будет мое ожидание, когда я изменю модель и return View(model).

ModelState.Clear() 

не ответ, потому что он дезинфицирует ModelState стирания ValidationSummary. Удаление ключа из ModelState не является хорошим, потому что оно удаляет ValidationSummary для этого ключа.

ModelState["Number"].Value = 
new ValueProviderResult("New Value", "New Value", CultureInfo.CurrentCulture) 

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

<input type="text" name="Number" id="Number" value="@Model.Number"/> 

вместо

@Html.TextBoxFor(x => x.Number) 
+0

Если вы не используете @ Html.TextBoxFor(), вам также необходимо добавить все атрибуты проверки вручную, что является громоздким – bgx

2

Если вы нашли ModelState.Clear(), чтобы быть слишком разрушительным, вы можете предназначаться только деталь вы меняется, сохраняя при этом все остальное с ModelState.Remove()

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(Repair r) 
{ 
    r.Number = "New Value"; 
    ModelState.Remove("Number"); 
    return View(r); 
} 

Кроме того, оказывается, что это не имеет значения, либо удалить() или Clear() ли вы вызвать этот метод, прежде чем обновить модель или после

0

Попробуйте это. Вы можете поместить его в базовый контроллер, если хотите. Это хорошо работает для меня. Это делает его настолько ненавязчивым, что все еще работает, но значения из модели отображаются правильно, как ОЖИДАЕМЫЕ.

public class BaseController : Controller 
{ 
    public override void OnActionExecuted(ActionExecutedContext context) 
    { 
     ModelState.ToList().Select(x => x.Value).ToList().ForEach(x => { x.AttemptedValue = null; x.RawValue = null; }); 

     // Do a bunch of stuff here if needed. Stuff like validation. 
     base.OnActionExecuted(context); 
    } 
} 
Смежные вопросы