【发布时间】:2010-02-24 12:45:45
【问题描述】:
我正在开发一个 ASP .Net MVC 项目,但即使我定义了具有不同编号的其他方法,我也无法使 Index() 重载。参数并为其提供了适当的路由。但它似乎不起作用。所以我只想问我们可以在控制器中创建重载方法吗?
【问题讨论】:
标签: c# asp.net asp.net-mvc
我正在开发一个 ASP .Net MVC 项目,但即使我定义了具有不同编号的其他方法,我也无法使 Index() 重载。参数并为其提供了适当的路由。但它似乎不起作用。所以我只想问我们可以在控制器中创建重载方法吗?
【问题讨论】:
标签: c# asp.net asp.net-mvc
如果使用不同的 HTTP 动词调用同名控制器操作,则它们可以在同一个控制器上使用。示例:
public ActionResult Index()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SomeModel model)
{
return View();
}
当您调用GET /Controller/Index 时将调用第一个操作,当您调用POST /Controller/Index 时将调用第二个操作。
【讨论】:
更具体地说,您必须通过选择标准来改变它(这可能是 Darin 所说的动词变化,但也可能是其他选择器属性,如 NonAction 或 ActionName)。就此而言,您可以创建自己的 ActionNameSelectorAttribute 派生类来创建自定义逻辑,以指示何时应在给定方法上使用给定方法。
更新:为每个请求添加代码。
我实际上正在创建一个示例 ActionMethodSelectorAttribute,b/c 我想不出一个好的用例来仅测试 ActionNameAttribute 尚未涵盖的名称。不过原理都是一样的。
public class AllParamsRequiredAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
var paramList = methodInfo.GetParameters().Select(p => p.Name);
foreach (var p in paramList)
if (controllerContext.Controller.ValueProvider.GetValue(controllerContext, p) == null) return false;
return true;
}
}
基本上,这只是获取它标记的操作方法上的参数名称,并进行测试以确保控制器的 ValueProvider 至少具有与每个相同名称的尝试值。这显然只适用于简单类型,并且不能测试以确保尝试的值可以正确转换或任何其他类型;它与生产属性相去甚远。只是想表明它很简单,并且实际上可以使用任何可以返回 bool 的逻辑。
可以这样应用,那么如下:
[AllParamsRequired]
public ViewResult Index(int count){/*... your logic ... */}
public ViewResult Index() {/*... more of your logic ... */}
在本例中,默认路由,url mydomain.com/?count=5 将匹配第一个,url mydomain.com/ 将匹配第二个。
保罗
【讨论】: