我在申请中接近路线错了吗?

时间:2011-08-22 18:32:06

标签: asp.net asp.net-mvc asp.net-mvc-3

我正在开发我的第一个ASP.NET MVC 3应用程序,并且我已经定义了一些操作来处理从菜单中添加/删除冰淇淋的操作。他们看起来像这样:

[HttpPost]
public PartialViewResult AddMenuIceCreamMapping(int iceCreamId, int menuId)


[HttpPost]
public PartialViewResult RemoveMenuIceCreamMapping(int iceCreamId, int menuId)

为了使这些操作不会导致404错误,我进入了Global.asax.cs文件并添加了以下内容:

routes.MapRoute(
  "AddMenuIceCreamMapping", // Route name
  "IceCream/AddMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
  new
  {
     controller = "IceCream",
     action = "AddMenuIceCreamMapping",
     iceCreamId = UrlParameter.Optional,
     menuId = UrlParameter.Optional
  } 
);

routes.MapRoute(
  "RemoveMenuIceCreamMapping", // Route name
  "IceCream/RemoveMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
  new
  {
     controller = "IceCream",
     action = "RemoveMenuIceCreamMapping",
     iceCreamId = UrlParameter.Optional,
     menuId = UrlParameter.Optional
  } 
);

和那些工作,这意味着我可以点击我页面上的添加或删除按钮,添加或删除冰淇淋/菜单映射。大。但是我期待会有更多像这样的情况,我可以看到这个路由容器有更多这样的条目。对于我的新手网络程序员来说,它看起来有点笨重,我开始认为也许我会以错误的方式解决这个问题。我呢?有没有更好的方法来解决这个问题,这样我就不会做“创建一些采取N个参数然后再添加路径”的操作。这里有什么建议吗?

4 个答案:

答案 0 :(得分:1)

你可以在你的映射中使用占位符来处理这个问题......你可以使用它来代替上面提到的东西(注意我没有指定默认值):

routes.MapRoute(
                "TwoParameterRoute", // Route name
                "{controller}/{action}/{id1}/{id2}", // URL with parameters
               );

如果你必须添加一个带有三个参数的路线,你可以扩展这个想法:

routes.MapRoute(
                "ThreeParameterRoute", // Route name
                "{controller}/{action}/{id1}/{id2}/{id3}" // URL with parameters
               );

在两个参数路径的控制器中,代码看起来像这样(对于一个人为的样本):

public ActionResult Index(int id1, int id2)
    {
        ViewData["id1"] = id1;
        ViewData["id2"] = id2;

        return View();
    }

最后要注意的是,您可以更改命名以匹配您可能具有的模式。在第一个示例中,您可以使用id1id2或类似内容来代替entityIdrelatedId

答案 1 :(得分:1)

您知道即使对POST请求也可以使用查询字符串参数吗?仅使用默认路由(新的ASP.NET MVC项目附带),您可以使用/IceCream/AddMenuIceCreamMapping/?iceCreamId=1&menuId=1/IceCream/RemoveMenuIceCreamMapping/?iceCreamId=1&menuId=1来完成操作。

使用querystringparameters还会显示此url是参数化方法调用,而不是对原始URL所指示的资源的引用。

答案 2 :(得分:0)

如果您的CRUD操作集将在您在应用程序中引入的每个自定义实体重复,那么您也可以将控制器作为参数。就像现在一样,你已经修复了控制器。我也会避免这么长的动作名称。我也会避免将Icecream拼写为IceCream。只是因为它的外观。

可能你应该有一个控制器Menu,它可以处理冰淇淋。冰淇淋处理自己的东西是有道理的,因为它是其他东西的一部分。

routes.MapRoute( 
  "RemoveIcecreamFromMenu", // Route name 
  "menu/remove-icecream/{iceCreamId}/{menuId}", // URLwith parameters 
  new 
  { 
     controller = "Menu", 
     action = "RemoveIcecream", 
     iceCreamId = UrlParameter.Optional, // i don't think those two should be optional
     menuId = UrlParameter.Optional 
  }  
); 

但冰淇淋控制器处理自己的CRUD是有道理的:

routes.MapRoute( 
  "CreateIcecream", // Route name 
  "icecream/create", // URLwith parameters 
  new 
  { 
     controller = "Icecream", 
     action = "Create"
  }  
); 

routes.MapRoute( 
  "DeleteIcecream", // Route name 
  "icecream/delete/{id}", // URLwith parameters 
  new 
  { 
     controller = "Icecream",
     action = "Delete",
     id = @"\d+" // this tells the routing engine only integer are accepted
  }  
);

答案 3 :(得分:0)

我会选择具有描述性网址且没有默认路线的内容:

routes.MapRoute(
  "IceCreamEdit", // Route name
  "{controller}/{action}/icecream/{iceCreamId}/menu/{menuId}" // URLwith parameters
);