【问题标题】:Making a Lambda Expression Target a Delegate regardless of signature使 Lambda 表达式目标成为委托而不考虑签名
【发布时间】:2010-05-20 12:12:04
【问题描述】:

好吧,也许标题不是世界上最具描述性的东西,但这个问题让我很生气。我要做的是创建一个 ActionLinkFor 辅助方法,如下所示:

public ActionResult Index()
{
   // Does Stuff
}

public ActionResult SomeAction(int param1)
{
   // Does Stuff
}

这是两种操作方法。动作方法可以有任意数量的参数,但出于我表达的目的,我不在乎。理想情况下,我一直在尝试的是这样的:

<%= Html.ActionLinkFor<HomeController>(m => m.Index, "Return Home") %>

会返回

<a href="/Home/Index">Return Home</a>

基于它解析的表达式。目标是现在我不使用“魔术字符串”来确定链接,而是使用编译的 lambda 表达式。如果有任何东西被重构,或者页面的位置发生了变化,那么哪些链接指向的地方就很清楚了。

问题是,该方法句柄的 lambda 表达式似乎无法解决正确的重载问题。我想我必须像这样进行一些重载:

public static MvcHtmlString ActionLinkFor<Controller>(this HtmlHelper helper, Expression<Func<Controller, ActionResult>> methodExpression, string linkName)
{
     // return parsed expression translated into a link
}

public static MvcHtmlString ActionLinkFor<Controller>(this HtmlHelper helper, Expression<Func<Controller, object, ActionResult>> methodExpression, string linkName)
{
    // Does the same thing
}

这样,当我说

m => m.Index // Chooses first ActionLinkFor since the Lambda would be a Func<Controller, object>
m => m.SomeAction // Chooses second ActionLinkFor since the method signature is different.

但是,这似乎不起作用。如果我像这样指定多个泛型参数:

<%= Html.ActionLinkFor<HomeController, int>(m => m.SomeAction, "Some Link") %>

它很好,但我不想在通用参数列表中指定方法签名。所以我的问题是:

1) 有没有一种方法可以“定位”方法名称而不管其签名如何?我可以使用反射来获取所有方法并使用魔术字符串,但我希望在设计时有一个 lambda 表达式,以便我可以指定链接。

2)如果可以提供解决方案,有没有简单的方法解析出方法名?我目前使用的算法很可能是个坏主意,并且有效地涉及一些转换,然后在我无法将其转换为更方便的类型时最终解析一个字符串。

【问题讨论】:

  • 这不只是从 MVC 期货中重新发明 LinkExtensions.cs 中的 ActionLink 表达式重载吗?
  • 嗯,我什至不知道!是的,看起来我正在重新发明轮子。

标签: c# asp.net-mvc delegates lambda html-helper


【解决方案1】:

看来我正在重新发明轮子。我将看一下 MVC Futures 代码。

【讨论】:

    【解决方案2】:

    在ASP.Net MVC 2.0 Futures你可以找到:

    Microsoft.Web.Mvc.LinkExtensions.ActionLink<TController>
    

    这是强类型的 ActionLink Helper。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多