ASP.NET MVC 2 действия для одного и того же маршрута? - PullRequest
1 голос
/ 22 декабря 2011

Предположим, я определил маршрут таким образом,

        context.MapRoute(
            "Preview",
            "/preview/{id}/{type}",
            new { controller = "Preview", action = "Invoice", id = UrlParameter.Optional, type = UrlParameter.Optional }
        );

У меня есть контроллер с действием Invoice

public ActionResult(int id, string type)
{
  if (type == "someType") 
  {
    // ...
  } 
  else
  {
    // ..
  }
}

Я хочу избавиться от дела If-Else внутри действия. Можно ли как-то приписать действие, чтобы ASP.MVC различал оба типа, например:

Просто псевдокод, чтобы показать идею?

[HttpGet, ActionName("Action"), ForParameter("type", "someType")]
public ActionResult PreviewSomeType(int id) {}

[HttpGet, ActionName("Action"), ForParameter("type", "someType2")]
public ActionResult PreviewSomeType2(int id) {}

Возможно ли что-то подобное в MVC2 / 3?

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Селектор метода действия

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

Я написал две публикации в блоге, которые помогут вам начать выбор метода действия в Asp.net MVC и подобные атрибуты.:

0 голосов
/ 22 декабря 2011

Я думаю, вот для чего нужна маршрутизация. Просто разделите ваш маршрут на два:

context.MapRoute(null, "preview/{id}/SomeType",
        new { 
              controller = "Preview", 
              action = "Action1", 
              id = UrlParameter.Optional, 
            }
    );

context.MapRoute(null, "preview/{id}/SomeOtherType",
        new { controller = "Preview", 
              action = "Action2", 
              id = UrlParameter.Optional, 
            }
    );

Или, может быть, более общий, используйте последний сегмент в качестве имени действия:

context.MapRoute(null, "preview/{id}/{action}",
        new { controller = "Preview",
              id = UrlParameter.Optional, 
            }
    );

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

controller/action/id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...