【问题标题】:ASP.NET MVC - About Constraints in RoutesASP.NET MVC - 关于路由中的约束
【发布时间】:2013-12-25 07:31:50
【问题描述】:

我在自定义路线上使用约束时遇到了困难。 以下是我的类RouteConfig.cs

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "produtos",
                url: "produtos/{action}/{id}",
                defaults: new { controller = "Produto", action = "Listar", id = UrlParameter.Optional },
                constraints: new { id = @"\d+" }
            );

            routes.MapRoute(
                name: "Default",
                url: "{action}/{controller}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

以下是我的控制器“产品”

public class ProdutoController : Controller
    {

        MozitMVCContext _context = new MozitMVCContext();

        [HttpGet]
        public ActionResult Cadastrar()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Cadastrar(Produto produto)
        {
            if (ModelState.IsValid)
            {
                _context.Produtos.Add(produto);
                _context.SaveChanges();

                return RedirectToAction("Cadastrar");
            }

            return View(produto);
        }

        [HttpGet]
        public ActionResult Alterar(int id)
        {
            var produto = _context.Produtos.Find(id);
            return View(produto);
        }

        [HttpPost]
        public ActionResult Alterar(Produto produto)
        {
            if (ModelState.IsValid)
            {
                _context.Produtos.Attach(produto);
                _context.Entry(produto).State = EntityState.Modified;
                _context.SaveChanges();
                return RedirectToAction("Listar");
            }

            return View(produto);
        }

        public ActionResult Listar()
        {
            var produto = _context.Produtos.ToList();

            return View(produto);
        }

        public ActionResult Detalhes(int id)
        {
            var produto = _context.Produtos.Find(id);
            return View(produto);
        }

        public ActionResult Excluir(int id)
        {
            _context.Produtos.Remove(_context.Produtos.Find(id));
            _context.SaveChanges();
            return RedirectToAction("Listar");
        }

    }

我想限制用户输入一个不同的数字,但是当我设置约束 [constraints: new {id = @"\d+"}] 我的 URL 最终采用“默认”路由时,为什么会发生这种情况? (我是 MVC 新手,对路由不太了解)。

我正在尝试学习视频课程并让我的代码正常工作,我包含了一张图片:(对不起,图片质量,视频打印)

【问题讨论】:

  • 约束中有空格吗?应该是 \d+ 没有空格(可能只是在这里格式化,所以只是问)
  • 是的,正在格式化。 :\ - 约束:新 {id = @"\d+"}
  • 写入默认路由的url

标签: c# asp.net-mvc routes asp.net-mvc-routing custom-routes


【解决方案1】:

ASP.NET MVC: Route with optional parameter, but if supplied, must match \d+也讨论了这个问题

简短的回答是:使用此约束模式:id = @"\d*"

【讨论】:

    【解决方案2】:

    对于像这样更简单的场景,您可以使用这样的 Regex 模式。它会起作用的。

    但是,为了获得适当的约束,尤其是在使用自定义约束时,您应该通过继承 IRouteConstraint 接口来创建自己的约束

    public class MyRouteConstratint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                //Logic goes here
                return true;
            }
        }
    

    并在 RouteConfig 中注册它,如下所示,

     routes.MapRoute(
                    name: "produtos",
                    url: "produtos/{action}/{id}",
                    defaults: new { controller = "Produto", action = "Listar", id = UrlParameter.Optional },
                    constraints: new MyRouteConstratint()
                );
    

    希望有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 2019-02-10
      • 2011-06-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多