ASP.Net MVC: сопоставить маршрут по значению параметра - PullRequest
0 голосов
/ 31 января 2011

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

У меня есть следующие методы действия:

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 или, возможно, по-другому) будет принята с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 31 января 2011

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

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

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

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

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

...