12

我正在尝试在 ASP.NET MVC3 中使用新的 WebGrid 以及我想显示一组执行各种操作(编辑、查看、删除)的链接图标的列之一......为此,我有一个 HtmlHelper 扩展,基本上输出以下 HTML:

<a href="" title=""><img alt="" src="" /></a>

扩展返回 MvcHtmlString 并且在 Razor 视图中单独使用时可以正常工作。例如:@Html.ActionLinkIconForEditAction("Customer", 2)

问题是我需要在传递对象 ID 时在 WebGrid 列中调用此帮助程序(每个操作一次)。我被难住的问题是编译器给了我一个错误,说它无法将 MvcHtmlString(或“lambda 表达式”,取决于我尝试的调用)转换为格式所期望的 System.Func...

例如,这有效:

grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", 2)</text>)

但这不会:

grid.Column(header: "", format: (customer) => @<text>@Html.ActionLinkIconForEditAction("Customer", customer.Id)</text>)
grid.Column(header: "", format: (customer) => Html.ActionLinkIconForEditAction("Customer", customer.Id))

我得到:

Error 4 Argument 3: cannot convert from 'lambda expression' to 'System.Func<dynamic,object>'

或者对于这个电话:

grid.Column(header: "", format: Html.ActionLinkIconForEditAction("Customer", customer.Id)),

我得到:

Error 5 Argument 3: cannot convert from 'System.Web.Mvc.MvcHtmlString' to 'System.Func<dynamic,object>'

奇怪的是,我还有其他列使用 lambda,直接 Model.Property 访问器,甚至是 String.Format("") 的输出......它们都工作正常......我阅读了 Func 和这个线程上的所有文档,但仍然无法弄清楚:)

谁能发现我做错了什么?

4

3 回答 3

15

我明白了 :) .... 问题似乎在于 C# 处理动态对象的方式...很多用户对此都很感兴趣...

修复就像将参数上的正确类型强制转换为我的扩展助手一样简单......所以这有效:

grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", (int)item.Id)

另一个技巧是在“item”对象中使用“built”而不提供您自己的..因此,例如,这不起作用:

grid.Column(header: "", format: (customer) =>  @<text>@Html.ActionLinkIconForEditAction("Customer", (int)customer.Id)

大量阅读、调整、学习……希望下一个版本在您需要向并非直接来自模型的列中添加内容时能够更容易使用……

问候 Z...

于 2011-02-25T23:17:19.760 回答
1
grid.Column(format: (item) => Html.ActionLink("EditCustomer","Editcustomer", new {CustomerId=item.CustomerId}))

这将起作用,并且上面一个也起作用。这里第一个“EditCustomer”是对用户可见的文本,第二个“EditCustomer”是您希望它重定向的操作名称,项目是

于 2012-07-25T11:12:31.717 回答
1

我必须在 C# 代码中创建一个WebGrid,并且必须使用超链接显示一个特定的列。上面提到的所有技术都不适合我。所以,我使用MvcHtmlString.create并传入了它的返回值String.format


  format: (item) => MvcHtmlString.Create(string.Format((A HREF=\"/Inventory/EditInventory/{0}\"){1}(/A)", item.ID, item.Property))) 

将字符串中的 ( 或 ) 分别替换为 < 或 >。

于 2012-09-03T12:45:04.277 回答