2012-09-03 113 views
30
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'}) 

它沒有工作!如何設置值?HTML.HiddenFor值集

回答

19

您不應該需要在attributes參數中設置值。 MVC應該自動爲你綁定它。

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" }) 
+1

它沒有工作! – arnoldrob

+0

沒關係但我犯了一個大錯誤!抱歉!謝謝 – arnoldrob

+0

這在MVC4中不起作用。 –

7

它只是值,而不是@value .. 試試吧。我不知道@ Model.title,也許它只是Model.title

+0

它does not工作! – arnoldrob

+0

@arnoldrob你嘗試過嗎?它應該看起來像:@Html.HiddenFor(model => model.title,new {id =「natureOfVisitField」,Value ='@ Model.title'})或者僅僅是Model.title。它在我的項目中運行 –

+0

我試過了,但不起作用!不管怎樣,謝謝! – arnoldrob

62

對於隱藏字段設定值做了以下方式:

@Html.HiddenFor(model => model.title, 
       new { id= "natureOfVisitField", Value = @Model.title}) 

它將工作

+0

它的工作原理,謝謝。 – Anthony

+0

將在MVC3中工作? –

+0

我知道我已經晚了2年多,但重要的是要注意,用這個呈現的Html標記將具有不同的'Value'和'value'標記。你想要使用'價值',因爲這是控制器將尋找你的數據的地方 – Ortund

3

Necroing這個問題因爲我最近在嘗試將相關屬性添加到現有實體時自己遇到了問題。我剛剛結束了做一個很好的擴展方法:

public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value) 
    { 
     string expressionText = ExpressionHelper.GetExpressionText(expression); 
     string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText); 

     return htmlHelper.Hidden(propertyName, value); 
    } 

使用像這樣:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id) 

注意,這也有類似的簽名內置HiddenFor,但使用通用的類型,所以如果價值是System.Object類型的,你實際上會調用內置到框架中的。不知道爲什麼你會在你的意見,雖然可以編輯System.Object類型的屬性...

24

奇怪,但是,嘗試用@Value,大寫字母「V」

例如(上MVC4工作)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id }) 

更新:

研究發現,@Value(資本V)與「價值」創造另一個屬性與「值」一起,用小@value似乎是工作呢!

需要檢查MVC源代碼才能找到更多。


更新,經歷後,如何在內部工作:

首先忘掉所有這些解決方法(我一直在這裏延續的緣故),現在看起來傻:)

基本上,它發生在模型發佈並且模型返回到同一頁面時。

的值被訪問(並形成爲HTML)中使用InputHelper方法(InputExtensions.cs)下面的代碼片斷

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string)); 

的GetModelStateValue方法(在Htmlelper.cs)獲取的值作爲

ViewData.ModelState.TryGetValue(key, out modelState) 

這是問題,因爲該值是從ViewData.ModelState字典訪問的。 這將返回從頁面發佈的值而不是修改後的值!

ie如果變量(例如Person.Id)的發佈值爲0,但是您在httpPost操作(例如Person.Id = 2)中設置值,則ModelState仍保留舊值「0」和企圖值包含「0」!所以渲染頁面中的字段將包含「0」作爲值!

解決方法如果要將模型返回到同一頁面:從ModelState清除項目, ModelState.Remove(「Id」);

這將刪除從字典和項目 ViewData.ModelState.TryGetValue(鍵,出來的ModelState) 返回null,以及下一條語句(內InputExtensions.cs)主罰實際值(valueParameter)傳遞給 HiddenFor(M => m.Id)

這是在下面的行中進行InputExtensions.cs

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue); 

總結: 使用ModelState.Remove(「...」)清除ModelState中的項目;

希望這是有幫助的。

+0

帶有「V」的值爲我工作。想你 – aboamin12

+0

我覺得這很奇怪,但它似乎是正確的。我在我的控制器中添加了ModelState.Remove(「」),我的問題消失了。 – RitchieD

+0

很棒。這個問題需要一些時間,並且這個問題需要追蹤。它令我擔憂的是我可能錯過了其他一些其他的細節。 –

相關問題