2011-11-07 30 views
2

我是一个关于剃刀的初学者,有时我会陷入非常简单的事情。MVC3和Razor - 如何为隐藏域设置动态值?

我有这样的foreach循环:

@foreach (dynamic item in ViewBag.EAList) 
{ 
<li> 
    @using (@Html.BeginForm("Duplicate, "Daily")) 
    { 
     <p>@item.AuthorComment</p> 
     @Html.Hidden("EstadoDeAlmaID", @item.EAID) 
     @Html.Hidden("PosterID", Session["id"].ToString()) 
     <input type="submit" value="Send" /> 
    } 
</li> 
} 

这条线:

@Html.Hidden("EstadoDeAlmaID", @item.EAID) 

不工作,我不知道如何使它工作,我尝试过很多办法,没有( - ),与@( - )...

有人可以帮我在我的隐藏字段中显示动态值吗? 此外,如果有人知道一个好的Razor样本网站,我会非常感谢。

+0

你有没有试过:@ Html.Hidden(“EstadoDeAlmaID”,item.EAID)? – gdoron

+0

是的,我得到错误:CS1973:'System.Web.Mvc.HtmlHelper '没有适用的方法名为'隐藏',但似乎有一个名称的扩展方法。扩展方法不能动态分派。考虑转换动态参数或调用扩展方法而不使用扩展方法语法 –

+0

这就是你的问题,@Gardini。 gdoron是对的,你应该怎么称呼它......然后看到我的答案;您使用的是动态类型,但扩展方法无法使用。 –

回答

2

为了避免扩展方法不能动态地调度例外,使用一个模型来代替ViewBag所以你不会使用dynamic物体(这将避免在查看所有不必要的铸造,是更符合MVC风格一般):

在你的行动,当您返回的观点:

return View("ViewName", db.EAList.ToList()); 

在您看来,第一行应该是:

@model IEnumerable<EAListItem> //or whatever the type name is 

然后就去做:

@foreach(var item in Model) 
+0

当我这样做时,我得到的错误:CS1579:foreach语句不能对'MvcWebRole1.Models.DiaryPosts'类型的变量操作,因为'MvcWebRole1.Models.DiaryPosts'不包含'GetEnumerator'的公共定义 –

+0

对不起,错字在我的第二个代码示例中。我已经表示过,它应该有'IEnumerable '或'List '其中'EAListItem'是你的行类型... –

+0

我对MVC3,Razor和EF非常陌生,我不能得到什么类放在List <>项内,我只有DBContext生成器生成的类。我不知道如何以更高级的方式处理这些问题。我用这样的方法解决了我的问题: int EAID = item.EstadoDeAlmaID; @ Html.Hidden(“EstadoDeAlmaID”,EAID) 我知道它的愚蠢,但它的工作原理。 –

4

在Razor中,一旦您在“C#land”中,您不再需要以@符号为前缀值。

这应该足够了:

@Html.Hidden("EstadoDeAlmaID", item.EAID) 

退房Scott Gu's article覆盖语法更多的帮助。

更新

而且我也想你<li></li>您使用块内移动,如剃须刀,当你换一个代码块内的HTML代码工作得更好。

此外,您的Html.BeginForm应该活在您的循环之外。

@using (@Html.BeginForm("Duplicate, "Daily")) 
{ 
    <ul> 
     @foreach (? item in ViewBag.EAList) 
     { 
      <li> 
       <p>@item.AuthorComment</p> 
       @Html.Hidden("EstadoDeAlmaID", item.EAID) 
       @Html.Hidden("PosterID", Session["id"].ToString()) 
       <input type="submit" value="Send" /> 
      </li> 
     } 
    </ul> 
} 

?foreach外环为EAList您的项目类型。

+0

我不认为这是一个好主意,把一个表格标签*外的*标签。这是无效的HTML。只有li标签作为ul或ol的直接后代才是合法的。 –

+0

对不起,我假设OP已经在其他地方包含了'ul' /'ol'。但是你是对的,那些应该包装'li'标签。 –

+0

也是,虽然你是正确的如何打这个电话......这不会解决问题。看到我的答案为什么。 –

1

你得到了错误,“扩展方法不能动态调度”...其中的谎言你的麻烦。

您应该声明循环变量不是动态类型的,而是集合中实际类型的。然后在@ Html.Hidden()调用中从item.EAID调用中删除@。

+0

我将我的循环更改为@foreach(ViewBag.EAList中的var项目),并从项目变量中删除@,它具有相同的错误。 –

+0

不是。集合的实际类型。您也可以将ViewBag.EAList添加为ActualListType以确保安全。 –

+0

我在控制器中的调用是“ViewBag.EAList = db.EAList.ToList();”什么应该是我的视图中的变量类型? –

0

对我来说,简单的解决方案是使用的ViewData,而不是ViewBag。无论如何,ViewBag只是​​ViewData的一个动态包装。

@Html.Hidden("ReportID", ViewData["ReportID"]) 

但我不知道这是否会帮助你的情况,因为你是在你的foreach循环中创建动态项目。

6

我有同样的问题,发现一个简单的演员解决了我的问题。

@ Html.Hidden(“ID”,(串)ViewBag.ebook.isbn)

0

我发现,当我想在HTML 返朴归真使用的视图袋数据经常工作对我来说

<input type="hidden" name="Data" id="Data" value="@ViewBag.Data" /> 

这给出了相同的结果。