15

Oto moja droga:użyciu MVC ograniczenia trasy tak URL może być odwzorowany tylko do jednej z trzech możliwych params

routes.MapRoute(null, "myaccount/monitor/{category}", // Matches 
       new { controller = "MyAccount", action = "Monitor", category = (string)null } 
); 

Chciałbym dodać ograniczenie więc kategoria może tylko dopasować null lub jeden z trzy params (czyli opis, projekcja, historia)

+0

ja osobiście wolę mający trzy oddzielne trasy zamiast stosowania ograniczeń trasy . –

Odpowiedz

24

UrlParameter.Optional można użyć w celu umożliwienia null, a także skorzystać z parametru MapRoute methodconstraints ..

routes.MapRoute(null, 
         "myaccount/monitor/{category}", // Matches 
         new { controller = "MyAccount", action = "Monitor", category = UrlParameter.Optional }, 
         new { category = "overview|projection|history"} 
      ); 
+0

Ah, dobry telefon. +1 dla świetnej i prostej odpowiedzi. –

0

Myślę, że trzeba użyć oddzielnych tras:

routes.MapRoute("Monitor", 
         "myaccount/monitor", // Matches 
         new { controller = "MyAccount", action = "Monitor" } 
      ); 

routes.MapRoute("MonitorHistory", 
         "myaccount/monitor/history", // Matches 
         new { controller = "MyAccount", action = "Monitor", category = "history" } 
      ); 

routes.MapRoute("MonitorOverview", 
         "myaccount/monitor/overview", // Matches 
         new { controller = "MyAccount", action = "Monitor", category = "overview" } 
      ); 

routes.MapRoute("MonitorProjection", 
         "myaccount/monitor/projection", // Matches 
         new { controller = "MyAccount", action = "Monitor", category = "projection" } 
      ); 

Alternatywnie, może chcesz zrobić coś takiego:

routes.MapRoute("MonitorGlobal", 
         "myaccount/monitor/{category}", // Matches 
         new { controller = "MyAccount", action = "Monitor", category = string.Empty } 
      ); 

a następnie w kontrolerze:

public ActionResult Monitor(string category) 
{ 
    switch (category) 
    { 
     case string.Empty: 
      // do something 
      break; 

     case "overview": 
      // do something 
      break; 

     // so on and so forth 

     default: 
      // no match, handle accordingly 
      break; 
    } 
} 
+0

tak jak powiedziałem;) –

3

Wbudowany napis Regex Gaby będzie działał. Innym sposobem, aby to zrobić jest zdefiniowanie niestandardowego IRouteConstraint:

public class FromValuesListConstraint : IRouteConstraint 
{ 
    private List<string> _values; 

    public FromValuesListConstraint(params string[] values) 
    { 
     this._values = values.Select(x => x.ToLower()).ToList(); 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     string value = values[parameterName].ToString(); 

     if (string.IsNullOrWhiteSpace(value)) 
     { 
      return _values.Contains(string.Empty); 
     } 

     return _values.Contains(value.ToLower()); 
    } 
} 

następnie przekazać w instancji przymusu do rozmowy MapRoute:

routes.MapRoute(null, 
    "myaccount/monitor/{category}", // Matches 
new { controller = "MyAccount", action = "Monitor", category = UrlParameter.Optional }, 
new { category = new FromValuesListConstraint ("overview", "projection", "history", string.Empty) } 
     ); 
Powiązane problemy