2013-12-08 116 views
2

我在自定义路由上使用约束时遇到困难。 以下是我的课RouteConfig.csASP.NET MVC - 关于路由中的约束

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

和下面是我的控制器“Produto”

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的新手,我不太了解路线)。

我试图按照视频课程,并让我的代码工作,我包括图像:(对不起,图像质量,视频打印)

Routes

+0

你的约束中是否有空格?它应该是'\ d +'没有空格(可能只是在这里格式化,所以只是问) –

+0

是的,格式化的东西。 :\ - constraints:new {id = @“\ d +”} – IgoR

+0

写入默认路由的url – vlukham

回答

0

对于这样一个简单的场景,你可以使用这样的Regex模式。它会工作。

但是,使用自定义约束,尤其是当得到约束适当的保持,你应该继承IRouteConstraint inteface

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

希望有帮助。