2012-10-09 59 views
0

這裏是從MVC3/Razor視圖文件的精簡的代碼片斷:爲什麼我在Html.HiddenFor中得到變量範圍錯誤(CS0136)?

@foreach (var item in Model.Stuff.Items){ 
<tr> 
    <td>@item.Title</td> 
</tr> 
<tr> 
    <td> 
    @using (Html.BeginForm()) { 
     @item.Title 
     @Html.HiddenFor(item => item.Title) 
    } 
    </td> 
</tr> 
} @* End of Items foreach loop *@ 

標題顯示在第一行上。 它也顯示在窗體中。但試圖在HiddenFor中使用它我得到錯誤CS0136一個名爲'item'的局部變量不能在這個範圍內聲明,因爲它會給'item'賦予不同的含義,'item'已經在'parent'或者current /孩子'的範圍來表示別的

我不明白爲什麼會這樣;在item => item.Title中,第一個「item」實際上只是匿名函數中的一個參數名稱,不是嗎?

當我將其更改爲:@Html.HiddenFor(s => s.Title)時出現錯誤CS1963,表達式樹可能不包含動態操作。

背景:目的是爲Model.Stuff.Items中的每個條目創建兩個錶行,第一個將當前信息作爲靜態HTML提供,第二個表爲它的編輯形式。 (其中一個或另一個將隨時使用javascript隱藏)。表單將提交給此控制器上的另一個操作。所有表單都提交到相同的URL;隱藏的值將標識哪一行正在更新。

回答

2

使用@Html.HiddenFor(x => item.Title)

@foreach (var item in Model.Stuff.Items){ 
<tr> 
    <td>@item.Title</td> 
</tr> 
<tr> 
    <td> 
    @using (Html.BeginForm()) { 
     @item.Title 
     @Html.HiddenFor(x => item.Title) 
    } 
    </td> 
</tr> 
} 
+0

感謝Yasser。不幸的是,然後給了我第二個錯誤我提到(CS1963)。順便說一句'Html.HiddenFor(x => x)'給我「_System.ArgumentException:值不能爲空或空_」 –

+0

嘗試'Html.HiddenFor(x => item.Title)'jnstead 'Html.HiddenFor(x => x)' – Yasser

+0

('@ Html.HiddenFor(x => item.Title)')是什麼給了CS1963錯誤。關於動態類型的東西。 –

2

我不明白爲什麼會這樣;在item => item.Title中,第一個「item」實際上只是匿名函數中的一個參數名稱,不是嗎?

是的,但是它將另一個同名的變量引入到已經包含該名稱的局部變量的作用域中。你不能那樣做。如果在lambda表達式中使用item,它會變得不明確 - 它可能意味着參數,或者它可能意味着迭代變量。

請注意,這與MVC或Razor無關。你得到了同樣的錯誤,此代碼:

int x = 0; 
Func<int, int> y = x => x; 

從C#5規範的部分17.15.1:

匿名函數的參數的範圍是匿名函數體。 (§3.7)與參數列表(如果給出)一起,匿名方法體構成一個聲明空間(§3.3)。因此,匿名函數的參數的名稱與局部變量,局部常量或範圍包含anonymous-method-expression或lambda-expression的參數的名稱相匹配時會出現編譯時錯誤。

+0

感謝Jon的非常明確的解釋。順便說一句,我_思考_這是不同的行爲,以我最近使用的其他語言,即R,JavaScript和PHP等同行爲但截止日期阻止我今天檢查:-( –

1

對於問題的CS1963部分,即通過設置在@Model此局部視圖文件的頂部,然後使決定,作爲HTML的第二參數.Partial()

所以,在我的外部看來,Html.Partial線改爲看起來像這樣:

@Html.Partial("partial.example",Model.Stuff.Items) 

然後在partial.examples的頂部。CSHTML,我說:

@model IEnumberable<Type.Of.Items> 

而且在foreach行改爲:

@foreach (var item in Model){ 

最後,擺脫CS0136錯誤的,因爲亞西爾·建議:

@Html.HiddenFor(x => item.Title) 

(和感謝Jon解釋爲什麼item => item.Title不允許。)

相關問題