2012-10-09 60 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不允许。)

相关问题