2012-11-02 3 views
2

Может кто-то, пожалуйста, помогите мне понять это. У меня есть следующий код:MVC HttpPost изменить модель и заменить вид

Контроллер

public ActionResult Stuff(PersonModel model) 
{ 
    model.Address = "Some Address"; 

    return PartialView("_Registration", model); 
} 

Взгляд

@Ajax.BeginForm("Stuff", new AjaxOptions(){ HttpMethod="POST", UpdateTargetId="the_form", InsertionMode=InsertionMode.Replace, OnSuccess="Stuff" }) 
{ 
    <div id="the_form"> 
     @{Html.RenderPartial("_Registration", new TypeScriptTest.Models.PersonModel());} 
    </div> 

    <input type="submit" value="Get Addreess" /> 
} 

Частичное Посмотреть

@model TypeScriptTest.Models.PersonModel 

<table> 
    <tr> 
     <td> 
      Name: 
     </td> 
     <td> 
      @Html.TextBoxFor(c => c.Name) 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Address: 
     </td> 
     <td> 
      @Html.TextBoxFor(c => c.Address) 
     </td> 
    </tr> 
</table> 

Данные размещены с тем, что я типа в двух областях , Но затем я заменяю значение свойства Address на «Some Address» и возвращаю PartialView, я ожидаю получить новое представление, которое заменяет старое. Вероятно, это происходит, но представление, которое заменяет старое, не включает новое значение «Some Address». Это выглядит точно так же, как и я, который я опубликовал.

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

public ActionResult Stuff(PersonModel model) 
{ 
    model.Address = "Some Address"; 

    var v = PartialView("_Registration"); 

    var view = v.ViewEngineCollection.OfType<System.Web.Mvc.RazorViewEngine>().Single().FindPartialView(new ControllerContext(HttpContext, RouteData, this), "_Registration", false); 

    var result = new PartialViewResult() { View = view.View }; 

    result.ViewData.Model = model; 

    return result; 
} 

Здесь я могу кеш, используя ложные в качестве последнего параметра в FindPartialView. Установка этого параметра в true приводит к той же проблеме, что и в обсуждении.

Почему это происходит и каков правильный способ обойти эту проблему? Мое обходное решение отлично работает, но я хотел бы понять проблему.

ответ

1

Если вам все еще интересно, это связано с тем, что значения, представленные в форме, хранятся в ModelState, а при рендеринге HtmlHelpers любое значение в ModelState имеет приоритет над вашими текущими значениями объекта модели.

Если вы хотите изменить значения, представленные пользователем, тогда вы можете либо очистить модельState, либо очистить запись для единственного свойства, которое вы хотите изменить. (Будьте внимательны при очистке состояния модели, так как это также устранит ошибки для любого переданного значения, по крайней мере, вы можете убедиться, что ModelState действителен до его ручной модификации)

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

Вы также можете найти полезный ответ на этот вопрос: Asp.net MVC ModelState.Clear

 Смежные вопросы

  • Нет связанных вопросов^_^