net - mvc c#



usando restricciones de ruta de mvc para que una url solo pueda ser asignada a uno de los tres parámetros posibles (2)

Creo que deberías usar rutas separadas:

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" }
            );

Alternativamente , es posible que desee hacer algo como:

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

Y luego en tu controlador:

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;
    }
}

Aquí está mi ruta:

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

Me gustaría agregar una restricción para que la categoría solo pueda coincidir con uno nulo o uno de los tres parámetros (es decir, descripción general, proyección, historial)


Answer #1

El en línea Regex Gaby publicado funcionaría. Otra forma de hacerlo es definir una IRouteConstraint personalizada:

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());
    }
}

Luego pase una instancia de la restricción a su llamada de 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) }
        );




asp.net-mvc-routing