2010-03-08 77 views
15

這是怎麼回事? viewmodel變量是一個值爲true的布爾值。布爾與HTML幫手隱藏和隱藏

<%= Html.HiddenFor(m => m.TheBool) %> 
<%= Html.Hidden("IsTimeExpanded",Model.TheBool) %> 
<input type="hidden" value="<%=Model.TheBool%>" name="TheBool" id="TheBool"> 

結果:

<input id="TheBool" name="TheBool" value="False" type="hidden"> 
<input id="TheBool" name="TheBool" value="False" type="hidden"> 
<input value="True" name="TheBool" id="TheBool" type="hidden"> 

我在做什麼錯?爲什麼助手不按預期工作?

+2

答案是http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value – 2013-07-08 12:03:24

+0

此註釋應該是正確的答案 - 助手首先使用POST值。因此,如果您在回發中更新TheBool,然後在未執行重定向/獲取的情況下顯示模型,則可能會顯示錯誤的值。 –

回答

13

1)使用不同的(唯一的)IDS

2)不使用這個幫手,使用

<input type="hidden" name="the-name" 
    value="<%= Html.AttributeEncode(Model.TheBool) %>" id="TheBool_1216786" /> 
+0

該id僅用於示例,由助手自動設置,與結果無關。問題是:爲什麼助手不按預期工作? – Martin

+0

這是一個問題,應該對MS,許多人有這麼奇怪的行爲(我發現在少一個相同的問題從其他人的要求)。我試圖幫助如何解決或避免它。我不在MS工作。 :)我沒有得到你的任何謝意,所以我不明白你爲什麼如此批評我的幫助。 – garik

+0

我很感謝你試圖幫助我。只是你沒有幫助我。事實上,您沒有提供任何尚未解決的相關信息。請把我引到你提到的問題。 – Martin

0

下面是剃刀一個例子:

html: 
@Html.HiddenFor(x => Model.TheBool, new { @id = "hdnBool" }) 

javascript: 
alert($('#hdnBool').val()); 

model: 
public class MyModel() 
{ 
    public bool TheBool{ get; set; } 
} 
0

作爲回答here的問題在於HTML助手默認使用發佈的值(如果可用),然後參考模型。就我個人而言,我不認爲這有多大意義,現在想知道在我們的平臺上等待的還有多少其他錯誤。

ModelState.Remove("TheBool") 

是的,這是一個有點廢話,因爲你只能使用一個字符串:

不管怎麼說,貼在上述回答的解決方案就能解決問題,只是你從控制器返回前添加此行參考......但它確實有效。

+0

是的 - 知道在我看代碼的幾年後,我會想「爲什麼我有這樣做」。 – AntDC

+1

我完全同意,並會全心全意地推薦圍繞所謂的「修復」的自由意見。然而,這是一個框架的缺陷,如果沒有這樣的混亂,這是不可避免的;也就是說,重寫OnActionExecute(或某些此類設備)試圖自動執行此操作只會導致進一步的意外行爲和問題 –

0

我有過類似的情況,最後這樣做了。 的情況是用戶想要保存,然後確認保存場景....

我選擇使用下面的解決方案,而不是

ModelSate.Remove("OperationConfirmed"); 

(其中不工作),因爲我覺得它更intuative ....

@{ 
    string btnSaveCaption = "Save Changes"; 
    if (Model.OperationConfirmed) 
    { 
    btnSaveCaption = "Confirm Save Changes"; 
    @Html.Hidden("OperationConfirmed", true) 
    }   
}