2015-09-25 15 views
0

我在我的MVC應用程序中發生了一件非常奇怪的事情。我將部分視圖渲染爲引導彈出窗口。控制器的動作看起來是這樣的:Html幫助者在給定某個名字時給出錯誤的值

[HttpGet] 
    public ActionResult GetModalForm(int id) 
    { 
     var vm = CreateViewModel(id) 
     return PartialView("MyPartialView", vm); 
    } 

這似乎做工精細,視圖模式有兩個字段:

public class MyViewModel 
{ 
    public int id { get; set; } 
    public int MemberId {get ; set;} 
} 

到目前爲止好,當我把一個破發點中的控制器操作,id和MemberId字段設置正確。

現在,這裏的情況變得有些古怪,我有我的部分觀點如下行(用於測試的問題):

@using() 
{ 
    @Html.TextBox("id", Model.id) 
    @Html.TextBox("something", Model.id) 
    <input type='submit'/> 
} 

當此呈現,一號線給我用同等價值的文本框到MemberId字段,第二行給我一個等於id字段的值。我真的不明白這兩條線如何爲同一領域提供不同的價值。奇怪的是,爲什麼第二行讀取MemberId字段?

有沒有人見過類似這樣的事情,或有任何想法可能會導致它?我正在達到智慧的結局。

在此先感謝您的幫助。

UPDATE:

爲了幫助解釋什麼是進一步發生的事情:如果我的視圖模型屬性是ID = x和成員Id = Y。然後下面一行:

@Html.HiddenFor(m => m.id) 

將呈現爲:

<input type="hidden" id="id" name="id" value="y"/> 
+0

你是什麼意思爲同一field_第一個被綁定到一個命名屬性'id',第二個_giving我不同的值是綁定到一個名爲something'屬性',但你重寫它的值與屬性id的值(一個可怕的做法)顯示你生成的實際html。 –

+0

上面的代碼會給我: Dean

+0

不可能,除非已將值添加到'ModelState'中。您在GET方法中添加了「MyViewModel」的參數,或者您從POST方法返回視圖,並且在返回視圖之前嘗試設置屬性的值,而不清除「ModelState」。顯示你的控制器方法。 –

回答

4

你的行動接受一個參數id。這意味着Request["id"]中有一個值,該值將進入ModelState。無論是ModelState中的哪一項都優先於您在Model上設置的值。所以,綁定到「id」的文本框將採用Request["id"]的值。

兩件事情:

  1. 它總是最好使用*For幫手,因爲它讓你可以綁定到你的模特屬性的強類型的方式。

    @Html.TextBoxFor(m => m.id) 
    
  2. 任何操作參數,你有,應該已經等同命名您的視圖模型的屬性,除非他們實際上應該是同樣的事情,持有同樣的價值觀。換句話說,如果參數id實際上對應於MemberId,那麼您應該在模型上沒有id屬性,或者應將操作參數重命名爲memberId

+0

感謝您的回答。 是的,我知道號碼1,這就是爲什麼我把「用於測試問題」放在括號中。我試着看看@ Html.TextBox試圖解決這個問題,並得到我在原始問題中解釋的內容。 行@ Html.TextBoxFor(m => m.id)正確綁定到id屬性,但它正在使用memberId值呈現。 對於數字2,在這種情況下,動作參數「id」相當於視圖模型屬性「id」。 – Dean

+0

Scratch,我實際上看了看代碼,action參數指向視圖模型屬性MemberId。我將動作參數的名稱更改爲MemberId並且presto,都很好。所以謝謝你的幫助。 – Dean

相關問題