2012-11-02 73 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> 

的數據公佈與任何我在這兩個字段中鍵入。但是,然後我用「Some Address」替換Address屬性值並返回一個PartialView,我期望得到一個替換舊的新視圖。這可能發生,但替換舊的視圖不包括新的「某個地址」值。它看起來完全像我發佈的視圖。

我有一個解決方法,但我想了解這裏發生了什麼。我的解決方法如下:

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中的任何值都優先於當前的模型對象值。

如果要更改用戶提交的值,則可以清除modelState或清除要更改的單個屬性的條目。 (在清除模型狀態時要小心,因爲這也將清除任何提交的值的錯誤,至少您可能希望在手動修改模型狀態之前確保ModelState有效)

我想,隨着你的工作,你會最終得到一個沒有提交值的乾淨的ModelState。

您可能也會對以下類似問題的答案有所幫助:Asp.net MVC ModelState.Clear