我正在尝试创建一个基于 Controller 名称和操作名称创建 url 的方法。我不想使用魔法字符串,所以我在考虑一种将 lambda 表达式作为参数的方法。

棘手的部分是,我不想在 action 方法上指定任何参数。例如,如果我有这个 Controller :

public class HomeController : IController
{
  public Index(int Id)
  {
     ..
  }
}

我想这样调用方法:
CreateUrl<HomeController>(x=>x.Index);

我想出的方法的签名是:
public string CreateUrl<TController>(Expression<Action<TController>> action) where TController : IController

但这并不能解决跳过参数的问题。我的方法只能使用指定的参数调用,如下所示:
CreateUrl<HomeController>(x=>x.Index(1));

是否可以在无需设置参数的情况下在 Controller 上指定操作或方法?

最佳答案

除非您的操作方法中有可选或默认参数,否则不可能在表达式树中省略参数。因为表达式树可以编译成可运行的代码,所以表达式仍然由编译器验证,所以它需要是有效的代码 - 方法参数等等。

如下面的 Dan 示例所示,提供默认参数非常简单:
public ActionResult Index(int Id = 0)
此外,由于操作方法必须返回某种结果,您的 Expression 应该是 Expression<Func<TController, object>> 类型,这将允许从表达式中定义的方法返回任何类型的对象。

一定要看看 MVCContrib

关于c# - 使用 lambda 表达式从 Controller 获取操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6581418/

10-17 00:54