2012-12-19 55 views
5

這是我的場景。使用HTML擴展的值與假定兩個模型具有同名屬性的值不同

  1. 具有公共屬性名

    public class SimpleModel1 
    { 
    // Some Properties 
    
    public string Property1 { get; set; } 
    
    } 
    
    public class SimpleModel2 
    { 
    // Some Properties 
    
    public string Property1 { get; set; } // Same name as Property1 in SimpleModel1 
    
    } 
    
  2. 用於SimpleModel1在一個動作(如索引)創建了兩個模型,返回,看起來像這樣

    @model MvcApplication2.Models.SimpleModel1 
    
    @{ 
    ViewBag.Title = "Home Page"; 
    } 
    
    @using (Html.BeginForm("Test", "Home", FormMethod.Post)) 
    { 
        <label>Enter something here</label> 
        @Html.TextBoxFor(m => m.Property1) 
        <button type="submit">Submit</button> 
    } 
    
  3. 視圖將該值提交給將SimpleModel1作爲參數的測試操作,執行一些操作並返回一個視圖,該視圖將採用SimpleModel2

    public ActionResult Test(SimpleModel1 model) 
    { 
        SimpleModel2 newModel = new SimpleModel2(); 
    
        // Do Something 
    
        newModel.Property1 = "Something different than model's Property1"; 
    
        return View(newModel); 
    } 
    
  4. 的Test.cshtml(查看通過測試操作返回)是如下:

    @model MvcApplication2.Models.SimpleModel2 
    
    @{ 
        ViewBag.Title = "Test"; 
    } 
    
    <h2>Test</h2> 
    
    @* Model Propery without using HTML extension*@ 
    @Model.Property1 
    
    @* Model property using HTML extension (Incorrect) *@ 
    
    @Html.TextBoxFor(m => m.Property1) 
    @Html.HiddenFor(m => m.Property1) 
    @Html.TextAreaFor(m => m.Property1) 
    
        @* Correct Value *@ 
    <input value="@Model.Property1" /> 
    

我想到的是,Property1的所有值將是「比模型Property1不同的東西「在測試行動中設置。但事實證明,使用Html擴展名(Html.TextBoxFor,Html.HiddenFor等)的那些具有發佈到Test Action的Property1值。例如,如果我將「What a surprise」(SimpleModel1的Property1)發佈到Test Action,SimpleModel2的Property1的值也是「多麼令人驚訝」,不管我將其設置爲什麼。

我不知道發生了什麼事。對我來說看起來像一個bug。有人有什麼主意嗎?

回答

10

當您執行POST時,您將看到此行爲,因爲發佈的數據在ModelState中保留。 Property1的值將爲該屬性發布的值。 爲了看到你的新的價值,你需要加入這一行的代碼在你的ActionResult測試:

ModelState.Clear(); 

一般來說只是要記住,如果此行您發佈的數據,修改它,並試圖請參閱返回視圖上的修改數據。

+0

這工作,但爲什麼這是一個HTML擴展方法的問題? @ Model.Property1如何顯示正確的值? –

+0

內部html擴展方法查看ModelState中的值以確定屬性的值。這就是他們如何寫的。我不知道他們爲什麼這樣寫。希望別人可以。我也有興趣知道。 – Dmitry

+3

@Dmitry如果你有一個post方法,而不是採用ViewModel,分別接受幾個參數,或者你使用表單集合來檢索值,那麼在驗證失敗的POST上,你不必分割膳食結構一個新的viewmodel並設置表單元素的所有各種屬性,因爲表單將從ModelState自動填充。對於我們其他人在POST參數中使用ViewModel來說,對於ModelState優先於視圖模型而言,這成爲一種煩惱。 – AaronLS

相關問題