2011-07-27 238 views
26

我可以用Html.HiddenFor值屬性沒有得到設置

@Html.HiddenFor(x=> ViewData["crn"]) 

但是,我得到的,

<input id="ViewData_crn_" name="ViewData[crn]" type="hidden" value="500" />

以某種方式規避這個問題(id=ViewData_crn_ and name=ViewData[crn]),我試圖做以下,但「值」屬性沒有設置。

@Html.HiddenFor(x => x.CRN, new { @value="1"}) 
@Html.HiddenFor(x => x.CRN, new { @Value="1"}) 

產生

<input id="CRN" name="CRN" type="hidden" value="" /> 
<input Value="500" id="CRN" name="CRN" type="hidden" value="" /> 

難道我做錯了什麼? 謝謝

+0

我不認爲HiddenFor知道如何從ViewData中「讀取」值。您可以使用Html.Hidden(「fieldName」,ViewData [「crn」]) – Vasea

+1

對於任何使用MVC 4的人,請參閱下面的@Gudradain答案。 – Yuck

回答

36

您是否嘗試過使用視圖模型而不是ViewData?以For結尾且採用lambda表達式的強類型幫助器無法與弱結構類型的結構(如ViewData)一起使用。

我個人並不使用ViewData/ViewBag。我定義了視圖模型,並讓我的控制器操作將這些視圖模型傳遞給我的視圖。

例如,在你的情況我會定義視圖模式:

public class MyViewModel 
{ 
    [HiddenInput(DisplayValue = false)] 
    public string CRN { get; set; } 
} 

有我的控制器操作填充此視圖模型:

public ActionResult Index() 
{ 
    var model = new MyViewModel 
    { 
     CRN = "foo bar" 
    }; 
    return View(model); 
} 

,然後讓我的強類型視圖只需使用EditorFor幫手:

@model MyViewModel 
@Html.EditorFor(x => x.CRN) 

哪會產生我:

<input id="CRN" name="CRN" type="hidden" value="foo bar" /> 

生成的HTML中。

+0

很抱歉對這樣一箇舊的答案發表評論,但如果你想隱藏輸入,你不想使用hiddenfor而不是editorfor。 –

+2

@ScottAdams,我用'[HiddenInput(DisplayValue = false)]'屬性在我的視圖模型上裝飾了CRN屬性,這會使EditorFor幫助器生成一個隱藏字段。 –

+0

現在看到了。抱歉。 –

3

請記住,第二個參數@ Html.HiddenFor僅用於設置該值,當它無法找到匹配該字段的路徑或模型數據時。達林是正確的,使用視圖模型。

5

我相信有一個更簡單的解決方案。 您必須使用Html.Hidden而不是Html.HiddenFor。看:

@Html.Hidden("CRN", ViewData["crn"]); 

這將創建一個type="hidden"標籤INPUTid="CRN"name="CRN",以及value屬性中的正確值。

希望它有幫助!

+4

雖然這可能看起來比[達林的答案](http://stackoverflow.com/a/6850618/61654)更簡單,它利用魔法字符串,因此增加了在重構等問題的可能性。 – ahsteele

48

以下將MVC 4

@Html.HiddenFor(x => x.CRN, new { @Value = "1" }); 

@Value物業工作是區分大小寫的。 @Value需要大寫'V'。

這裏是我的模型

public int CRN { get; set; } 

這裏是什麼是HTML輸出,當你在瀏覽器中

<input value="1" data-val="true" data-val-number="The field CRN must be a number." data-val-required="The CRN field is required." id="CRN" name="CRN" type="hidden" value="1"/> 

看這裏是我的方法

[HttpPost] 
public ActionResult MyMethod(MyViewModel viewModel) 
{ 
    int crn = viewModel.CRN; 
} 
+5

不能相信大寫字母V的作品! – UserControl

+1

這讓我非常沮喪。 'HiddenFor(t => t.Id)'不起作用。使用'@value = Model.Id'不起作用。我不得不使用'@ Value' - 大寫'V'顯然非常重要。這很糟糕,必須是一個錯誤。 – Yuck

+1

是的,首都V很重要。另外,@似乎並不是必需的。 @Value和正義值都適合我。 – Gudradain