Il più semplice modo sarebbe quella di aggiungere solo un altro percorso senza il parametro userId
, in modo da avere un ripiego:
routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = @"\d+"});
routes.MapRoute("Profile", "profile",
new {controller = "Profile",
action = "Details"});
Per quanto ne so, l'unico altro modo si può fare questo sarebbe con un vincolo personalizzato. Quindi il percorso diventerebbe:
routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = new NullableConstraint());
E il codice vincolo personalizzato sarà simile a questa:
using System;
using System.Web;
using System.Web.Routing;
using System.Web.Mvc;
namespace YourNamespace
{
public class NullableConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest && parameterName == "userId")
{
// If the userId param is empty (weird way of checking, I know)
if (values["userId"] == UrlParameter.Optional)
return true;
// If the userId param is an int
int id;
if (Int32.TryParse(values["userId"].ToString(), out id))
return true;
}
return false;
}
}
}
Non so che NullableConstraint
è il miglior nome qui, ma che sta a voi!
fonte
2010-10-05 10:13:09
Ho creato qualcosa di simile a questo, ma leggermente più generico, con un costruttore che utilizza un'espressione regolare per confrontarsi con il valore fornito. Grazie! –
So che arrivo molto tardi qui, ma non dovrei restituire l'ultima riga vero? In caso contrario, il vincolo non riesce sempre se la direzione del percorso è UrlGeneration. –
Se l'ultima riga è restituita vera, * qualsiasi cosa * corrisponde al vincolo ... ma sì, hai ragione, questo non prende in considerazione altro che il routing delle richieste in entrata. Guardandolo ora, avrei pensato di rimuovere la parte routeDirection dell'istruzione 'if' del tutto; Verificherò domani e modificherò se questo è il caso. –