我正在开发我的第一个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个参数然后再添加路径”的操作。这里有什么建议吗?
答案 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();
}
最后要注意的是,您可以更改命名以匹配您可能具有的模式。在第一个示例中,您可以使用id1
和id2
或类似内容来代替entityId
和relatedId
。
答案 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
);