2011-01-31 85 views
0

我试图在网站上创建类似向导的工作流程,并且我为每个步骤都有一个模型。ASP.Net MVC:根据参数值映射路由

我有以下操作方法:

public ActionResult Create(); 
public ActionResult Create01(Model01 m); 
public ActionResult Create02(Model02 m); 
public ActionResult Create03(Model03 m); 

而且我希望用户看到地址

/Element/Create 
/Element/Create?Step=1 
/Element/Create?Step=2 
/Element/Create?Step=3 

所有的模型类从具有步骤属性BaseModel继承。 具有参数的操作方法具有正确的AcceptVerbs约束。

我尝试命名所有方法创建,但导致AmbiguousMatchException。

我现在想要做的是为每个动作创建一个自定义路由,但我无法弄清楚如何去做。 这是我试过的:

 routes.MapRoute(
     "ElementsCreation", 
     "Element/Create", 
     new{controller="Element", action="Create01"}, 
     new{Step="1"} 
     ); 

但是这不起作用。

任何帮助(在正确的MapRoute调用或可能是一种不同的方法)将不胜感激。

谢谢

回答

0

我实际上找到了一种不同的方法。

我创建了一个新的Action Method属性来验证传递的请求是否对每个操作方法有效,而不是添加新的Route Map。

这是属性类:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class ParameterValueMatchAttribute : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
     var value = controllerContext.RequestContext.HttpContext.Request[Name]; 
     return (value == Value); 
    } 

    public string Value { get; set; } 
    public string Name { get; set; } 
} 

而且我有相同名称的操作方法,每一个装饰这样的:

[AcceptVerbs(HttpVerbs.Post)] 
[ParameterValueMatch(Name="Step", Value="1")] 
public ActionResult Create(Model01 model) 

我喜欢这种方法,很多不止为每种方法创建一条路线。