13

Pracowałem nad dużą aplikacją MVC przez ostatni miesiąc, ale jest to pierwszy raz, kiedy potrzebowałem zdefiniować niestandardowy program obsługi trasy i mam pewne problemy. Zasadniczo mam dwa parametry do przekazania. Pierwszy jest wymagany, a drugi opcjonalny.Routing ASP.NET MVC z jednym obowiązkowym parametrem i jednym opcjonalnym parametrem?

Podążam tą odpowiedzią here.

Oto mój zwyczaj trasa:

routes.MapRoute(
    "MyRoute", 
    "{controller}/{action}/{param1}/{param2}", 
    new { 
     controller = "MyController", 
     action = "MyAction", 
     param1 = "", 
     param2 = "" // I have also tried "UrlParameter.Optional" here. 
    } 
); 

A moja akcja metoda podpis:

public ActionResult MyAction(string param1, string param2) 

Gdy próbuję URL http://[myserver]/MyController/MyAction/Test1/Test2 to działa jak oczekuję go z Param1 = „Test1 "i param2 =" Test2 "

Jeśli spróbuję adresu URL http://[myserver]/MyController/MyAction/Test1, oba parametry będą mieć wartość null.

Mam nadzieję, że ktoś może mi powiedzieć, co robię źle tutaj, ponieważ jestem zgubiony.

+0

Cześć z przyszłości - spróbuj przypisać routingu teraz - sposób sposób łatwiejszy i mniej podatne na błędy. – niico

Odpowiedz

13

Zakładam, że stworzył nową trasę i opuścił jedną domyślną, która jest bardzo podobna do twojej. Należy pamiętać, że zbieranie tras odbywa się w celu znalezienia pierwszej pasującej trasy. Więc jeśli opuściły domyślną:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

powyżej trasie wtedy będzie on pasował do http://[myserver]/My/MyAction/Test1 żądanie i wezwanie MyController.MyAction i ustaw „text1” parametr nazwany id. Co nie powiedzie się, ponieważ ta czynność nie powoduje zadeklarowania nazwy o nazwie id.

Co trzeba zrobić, to przenieść swoją trasę jako pierwszy na liście tras i uczynić go bardziej szczegółowe to jest teraz:

routes.MapRoute(
      "Route", 
      "My/{action}/{param1}/{param2}", 
      new 
      { 
       controller = "My", 
       action = "MyAction", 
       param1 = "", 
       param2 = "" 
      }); 

To zmusi cały ruch kierowany koryta My dopasować tę trasę.

+1

Bez względu na to, co robię, nie mogę uzyskać wielu parametrów do pracy na ścieżce takiej jak ta. Jeśli spróbuję utworzyć 2 parametry i zażądam strony z adresem URL takim jak 'My/MyAction/param1/param2', otrzymam błąd 404. Co ja robię źle? – DavidHyogo

1

hi utworzeniu pogrom tak myślę, że to będzie hep Ci

routes.MapRoute(
       "Regis", // Route nameRegister 
       "Artical/{id}", // URL with parameters 
       new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults 
      ); 
0

Spróbuj

routes.MapRoute("MyRoute", 
       "myRoute/{param1 }/{param2 }", 
       new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, 
       new { param2 = @"\w+" }); 

można określić jeden parametr jako opcja za pomocą „UrlParameter.Optional” i podano drugi z DataType znaczy jeśli przejdą wartość całkowitą następnie TypDanych (@ „\ d +”) a dla napisu mam wzmiankę powyżej.

UWAGA: Kolejność parametru jest bardzo ważne Opcjonalny parametr musi przejść w ostatnim i zarejestrować swoją nową trasę przed trasa domyślna W Gloab.asax.

wtedy działanie łącza jak

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a> 

lub z jednym parametrem

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a> 

W Tobie Controller

public ActionResult MyAction(string param2,string param1) 
{ 
    return View() 
} 
Powiązane problemy