ASP.NET MVC zapewnia proste szablony do metod kontrolera, takich jak Details i może mieć coś w rodzaju:

public ActionResult Details(int id)
{
    // do something
}

Dostęp do tego można uzyskać: http://localhost:port/Controller/Details/id

Próbuję zrobić, to zamiast tego zapewnić inny typ:

public enum MyEnum
{
    All,
    Pending,
    Complete
}

A następnie skonfigurowuję moją metodę kontrolera, tak jak:

public ActionResult MyMethod(MyEnum myEnum = MyEnum.Pending)
{
    // do something
}

Działa dobrze dla: http://localhost:port/Controller/MyMethod/, ponieważ używa domyślnego argumentu.

Aby określić inny argument, który muszę zrobić http://localhost:port/Controller/MyMethod?myEnum=All i to działa.

Zastanawiam się, czy mogę być w stanie zrobić http://localhost:port/Controller/MyMethod/All zamiast używać ?myEnum=All?

Po próbie tego zrobić, otrzymuję wyjątek 404, który jest zrozumiały, ale dlaczego tak się stało dla id w Details?

Czy mogę zmienić MapRoute, który jest obecnie: url: "{controller}/{action}/{id}", aby pozwolić mi osiągnąć go z moim własnym typem?

Czego próbowałem do tej pory:

Chcę tylko egzekwowanie trasy dla jednego z moich schematów, takich jak http://localhost:port/Controller/MyMethod/{ViewType}, próbowałem To, ale nie wydaje się nic robić:

routes.MapRoute(
    "MyRoute",
    "MyController/Index/{MyEnum}",
    new { controller = "MyController", action = "Pending" }
);
9
sham 15 luty 2017, 19:26

2 odpowiedzi

Najlepsza odpowiedź

/Controller/MyMethod/All rzeczywiście działał. Problem jest z domyślną trasą, która rozważy All, aby być parametrem trasy id, która nie ustala się z tym, co korzysta z parametru. Właściwie działałoby dobrze, jeśli podpis twoje działanie było:

public ActionResult MyMethod(MyEnum id = MyEnum.Pending)

Ponieważ będzie to wiązać All do właściwej rzeczy.

Możesz mógłbyś dodać kolejną trasę do tego zastosowania, ale musisz być ostrożny, że nie tylko utworzysz kolejnej "domyślnej" trasy, która przejmie. Innymi słowy, musisz naprawić część adresu URL:

routes.MapRoute(
    "MyCustomRoute",
    "Controller/{action}/{myEnum}",
    new { controller = "Controller", action = "MyMethod", myEnum = MyEnum.Pending }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 );

Następnie, przez zwykłą obecność prefiksu /Controller/ do trasy, zamiast tego użyje swojej niestandardowej trasy i wypełnij All dla param {x2}}}, zamiast uderzyć w domyślną trasę i Spróbuj wypełnić id.

Należy jednak pamiętać, że przy użyciu ENUMS jako parametry trasy muszą one być dokładne dopasowania . Tak więc, podczas gdy /Controller/MyMethod/All będzie działać, /Controller/MyMethod/all nie będzie. Aby to przejść, musisz utworzyć niestandardowy spoiwo modelu. Zrobiłem szybkie wyszukiwanie i znalazłem następujące elementy Artykuł, który może ci pomóc w tym względzie.

9
Chris Pratt 15 luty 2017, 16:45

Możesz rzeczywiście. Nie zmieniaj domyślnej trasy "{controller}/{action}/{id}", ale raczej dodaj jeden przed domyślnie. Ten nowy musi być dość specyficzny:

routes.MapRoute(
    "EnumRoute",
    "Controller/MyMethod/{myEnum}",
    new { controller = "Controller", action = "MyMethod", myEnum = UrlParameter.Optional }
);

Co zasadniczo mówi, że jest "Kiedy widzisz prośbę o dosłownie kontroler / MyMethod / cokolwiek, użyj tego kontrolera i tej metody i przekazać cokolwiek jako parametru żądania". Należy pamiętać, że rzeczywisty kontroler nie ma potrzeby, musi być jaką trasę mówi w adresie URL, chociaż dobrze jest trzymać się tego.

2
Andrei 15 luty 2017, 16:36