Как у меня есть необязательный параметр, но все же проверить их в asp.net MVC маршрутизации? - PullRequest
2 голосов
/ 31 декабря 2010

У меня есть этот маршрут, который я только что добавил

        routes.MapRoute(
            "MyRoute",
            "MyController/{action}/{orgId}/{startDate}/{endDate}",
            new
                {
                    controller = "MyController",
                    action = "MyAction",
                    orgId = 0,
                    startDate = DateTime.Today.AddMonths(-1),
                    endDate = DateTime.Today
                },
            new
            {
                action = new FromValuesListConstraint(new string[] { "MyAction", "MyActionEx" }),
                orgId = new IntegerRouteConstraint(),
                startDate = new DateTimeRouteConstraint(),
                endDate = new DateTimeRouteConstraint()
            }

когда я добавляю этот URL, он разрешается до маршрута по умолчанию (контроллер, действие, id), и вышеуказанный маршрут не перехватывает этот URL:

http://localhost:1713/MyController/MyAction/16

Но это ниже работает нормально.

http://localhost:1713/MyController/MyAction/16/11-May-10/11-May-10

мой вопрос в том, что я думал, что оба будут работать, так как я задаю значения по умолчанию для полей startDate и enddate

Я проверил это, используя RouteDebugger , и этот маршрут оказался ложным

как я могу иметь эти два последних параметра как необязательные, но все еще иметь проверку?

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Проблема в том, что в этом текущем формате не подходит к вашему маршруту (требуется URL-адрес из 5 частей). Вы можете изменить эту строку

      startDate = DateTime.Today.AddMonths(-1),
      endDate = DateTime.Today

до

      startDate = UrlParameter.Optional,
      endDate = UrlParameter.Optional

И выполнить преобразование и значения по умолчанию в самом контроллере.

0 голосов
/ 31 декабря 2010

Вы можете следовать методу @ Aliostad и затем написать свой собственный атрибут фильтра действий, чтобы проверить параметры, входящие в метод. Если они не соответствуют вашим ограничениям, отклоните URL-адрес, как обычно.

public class ValidateParameterFilter : ActionFilterAttribute
{
        base.OnActionExecuting(filterContext);

        bool areParametersValid = true;

        if (filterContext.ActionParameters.ContainsKey("startDate"))
        {
            DateTime startDate;

            if (!DateTime.TryParse(filterContext.ActionParameters["startDate"].ToString(), out startDate))
            {
                // Not a DateTime so bad data in here
                areParametersValid = false;
            }
        }

        if (filterContext.ActionParameters.ContainsKey("endDate"))
        {
            DateTime endDate;

            if (!DateTime.TryParse(filterContext.ActionParameters["endDate"].ToString(), out endDate))
            {
                // Not a DateTime so bad data in here
                areParametersValid = false;
            }
        }

        if (!areParametersValid)
        {
            // Redirect to error page or throw an exception
        }
}

Тогда на вашем действии просто украсьте его атрибутом

[ValidateParameterFilter]
public ActionResult MyAction (int orgId, DateTime startDate, DateTime endDate)
{
...
}

Хотя я думал, что если у вас есть тип, объявленный как DateTime, то значение abc будет отклонено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...