【问题标题】:How do i have optional parameter but still validate them in asp.net mvc routing?我如何有可选参数但仍然在 asp.net mvc 路由中验证它们?
【发布时间】:2010-12-31 14:25:36
【问题描述】:

我有刚刚添加的这条路线

        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),并且上面的 rout 不会捕获这个 url:

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

但这下面的工作正常。

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

我的问题是我认为两者都可以工作,因为我为 startDate 和 enddate 字段提供默认值

我使用the RouteDebugger 对此进行了测试,这条路线出现了错误

我怎样才能将最后两个参数作为可选参数但仍然有验证?

【问题讨论】:

  • 路由的顺序很重要。这是在默认路由之前还是之后?
  • @Aliostad - 它高于文件中的默认路由(我不确定那是之前还是之后)。并且路由调试器将其解析为 FALSE,因此即使顺序颠倒,它仍然找不到匹配项
  • 我是这么认为的。您的格式目前需要由 5 部分组成的 URL。看我的回复。

标签: asp.net-mvc url-routing


【解决方案1】:

问题是这个当前格式不适合您的路线(需要 5 部分 URL)。 您可以更改此行

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

      startDate = UrlParameter.Optional,
      endDate = UrlParameter.Optional

并在控制器本身中进行转换和默认设置。

【讨论】:

  • 这里的问题是,如果我删除围绕这些字段的路由约束(DateTimeRouteConstraint 约束),这将起作用。是否有任何约束和可选参数。有点像约束,如果有??
  • 我试过了。如果我保持我的约束,那么它仍然无法解决。如果我删除了这些约束,那么它确实有效,但它也允许这样做:localhost:1713/MyController/MyAction/16/1/abcd 因为缺乏对日期字段参数的验证
  • 我看到我的朋友了。抱歉 - 想不出任何东西。如果你愿意,很高兴删除答案。
  • 不,如果没有解决方法,那么您的回答是正确的。我投了赞成票
【解决方案2】:

您可以遵循@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 值将被拒绝。

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 2014-08-31
    • 2022-12-15
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多