2011-01-31 2 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, который имеет свойство Step. Методы действия, имеющие параметры, имеют правильное ограничение AcceptVerbs.

Я пробовал называть все методы Create, но это привело к исключению AmbiguousMatchException.

Теперь я хочу создать собственный маршрут для каждого из действий, но я не могу понять, как это сделать. Это то, что я пробовал:

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

Но это не работает.

Любая помощь (по правильному вызову MapRoute или, возможно, другой подход) была бы весьма признательна.

Thanks

ответ

0

Я действительно нашел другой подход.

Вместо добавления новой карты маршрутов я создал новый атрибут Action Method, чтобы проверить, является ли переданный запрос действительным для каждого из методов действия.

Это класс атрибута:

[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) 

Мне нравится этот подход намного больше, чем создавая один маршрут для каждого метода.

Смежные вопросы