【问题标题】:ASP.NET MVC3 WebGrid format: parameterASP.NET MVC3 WebGrid 格式:参数
【发布时间】:2011-07-04 14:35:32
【问题描述】:

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

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

扩展返回 MvcHtmlString 并且在 Razor 视图中单独使用时可以正常工作。例如: @Html.ActionLinkIconForEditAction("客户", 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 和 this thread as well 的所有文档,但仍然无法弄清楚:)

谁能发现我做错了什么?

【问题讨论】:

标签: c# lambda asp.net-mvc-3 webgrid


【解决方案1】:

我明白了:) .... 问题似乎在于 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...

【讨论】:

  • 谢谢,我在寻找有关使用我自己的自定义 html 格式化列的信息时遇到了这个问题。不同之处在于我使用的是默认视图引擎并且很难找到“@@Html...”符号的等价物,所以我所做的是创建一个 MvcHtmlString:grid.Column("Field" ,"Header", item => MvcHtmlString.Create(string.Format("

    {0}

    ", item.Field))) 想我会分享。有没有更好的办法?请指点我:)
【解决方案2】:
grid.Column(format: (item) => Html.ActionLink("EditCustomer","Editcustomer", new {CustomerId=item.CustomerId}))

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2011-09-14
      • 2011-12-07
      • 2011-07-20
      • 2016-06-06
      • 2013-02-13
      相关资源
      最近更新 更多