C# 使用lambda表达式从控制器获取操作
我正在尝试创建一个基于controllername和actionname创建url的方法。我不想使用神奇的字符串,所以我正在考虑一种将lambda表达式作为参数的方法 棘手的是,我不想在action方法上指定任何参数。例如,如果我有这个控制器: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>
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
。