Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用lambda表达式从控制器获取操作_C#_Asp.net Mvc_Expression Trees - Fatal编程技术网

C# 使用lambda表达式从控制器获取操作

C# 使用lambda表达式从控制器获取操作,c#,asp.net-mvc,expression-trees,C#,Asp.net Mvc,Expression Trees,我正在尝试创建一个基于controllername和actionname创建url的方法。我不想使用神奇的字符串,所以我正在考虑一种将lambda表达式作为参数的方法 棘手的是,我不想在action方法上指定任何参数。例如,如果我有这个控制器: public class HomeController : IController { public Index(int Id) { .. } } 我想这样调用该方法: CreateUrl<HomeController>

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

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

public class HomeController : IController
{
  public Index(int Id)
  {
     ..
  }
}
我想这样调用该方法:

CreateUrl<HomeController>(x=>x.Index);
CreateUrl<HomeController>(x=>x.Index(1));
CreateUrl(x=>x.Index);
我提出的方法的特征是:

public string CreateUrl<TController>(Expression<Action<TController>> action) where TController : IController
公共字符串CreateUrl(表达式操作),其中TController:IController
但这并不能解决跳过参数的问题。只能使用如下指定的参数调用我的方法:

CreateUrl<HomeController>(x=>x.Index);
CreateUrl<HomeController>(x=>x.Index(1));
CreateUrl(x=>x.Index(1));

是否可以在不必设置参数的情况下在控制器上指定操作或方法?

使用。这是删除所有魔术字符串并执行更多操作的最佳选项

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

如下面Dan的示例所示,提供默认参数非常简单:

public ActionResult索引(int Id=0)

此外,由于操作方法必须返回某种结果,因此表达式的类型应为
Expression
,这将允许从表达式中定义的方法返回任何类型的对象


一定要签出。

正如bdowden所说,您必须为参数本身提供参数或默认值:

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

此外,如果您使用这些扩展方法,则已经存在。(请查看UrlHelperExtensions)

谢谢你的回答,我已经担心这不可能了。在我的用例中不能使用MvcContrib,我需要在流畅的界面实现中使用该方法。我不太同意你的答案。表达式的类型应为
Expression
,可以轻松地提供lambda表达式,而无需提供任何参数,只需提供操作参考,即
c=>c.Index
。这是正确的答案。您可能想要所有这些,因为您想要摆脱控制器操作的硬编码字符串。T4MVC将允许您这样做。不,我希望这是我正在编写的组件的流畅接口的一部分。如果您需要它,您很可能做错了什么。使用ASP.NET MVCYou应该尝试使用此表达式类型
expression
,并且可以省略括号
c=>c.Index