描述
我在我的一个MVC控制器中仅使用 属性路由:
[RoutPrefix("Groups")] // NOTE: I want to use "Groups" with an "s" here.
public class GroupController : Controller
{
[HttpGet]
[Route("Edit/{id}")]
public ActionResult Edit(Guid id)
{
//...
}
[HttpPost]
[Route("Edit")]
public ActionResult Edit(GroupEditViewModel model)
{
// ...
}
}
在Razor视图中,每当使用帮手时,例如:
@Html.ActionLink("Text", "Edit", new {controller = "Groups", id = "someId"})
或
@Html.BeginForm(actionName: "Edit", controllerName: "Groups")
{
}
辅助函数生成的路由为null
:
<a href>Text</a>
和
<form action></form>
问题
答案 0 :(得分:4)
属性路由已知的常见做法是将RoutePrefix
设置为与控制器名称相同的名称:
[RoutePrefix("Group")]
public class GroupController : Controller
{
// ...
}
但是,正如我看到的here,可以在不改变/删除原始路线的情况下设置自定义名称:
[RoutePrefix("Groups")]
public class GroupController : Controller
{
// ...
}
请记住RoutePrefix
属性仅提供访问相应控制器的替代方法,而不是更改其原始名称。
路由前缀只是我们想要应用的任何路由的前缀,我们需要做的就是在控制器上定义路由前缀,以便其中的所有操作方法都可以遵循前缀。
OTP,因为&#34;群组&#34;只是一个RoutePrefix
参数值而不是控制器类,所有使用的HTML帮助器和#34;组&#34;因为控制器名称将在各自的HTML属性上返回null值。
因此,必须使用原始控制器的名称而不是RoutePrefix
值:
@Html.ActionLink("Text", "Edit", new {controller = "Group", id = "someId"})
@Html.BeginForm(actionName: "Edit", controllerName: "Group")
{
}
或在MapRoute
方法中使用RegisterRoutes
来操纵网址以及原始控制器的名称:
// note that "Group" controller declared with "Groups" as part of relative URL
routes.MapRoute("Groups", "Groups/{action}/{id}", new { controller = "Group", action = "Edit", id = UrlParameter.Optional });
要在路由时激活RoutePrefix
效果,MapMvcAttributeRoutes()
应插入RegisterRoutes
方法。
CMIIW。
答案 1 :(得分:0)
路由前缀属性[RoutePrefix("Groups")]
控制生成的URL。但是,MVC将始终使用类名作为控制器的名称。
他们不必是一样的。您只需使用路由前缀来控制生成的URL,并在需要时使用类名作为控制器名称,并且生成的URL将是正确的。
在你的例子中:
[RoutePrefix("Groups")]
public class GroupController : Controller
{
[HttpGet]
[Route("Edit/{id}")]
public ActionResult Edit(Guid id)
{
//...
}
[HttpPost]
[Route("Edit")]
public ActionResult Edit(GroupEditViewModel model)
{
// ...
}
}
以下
@Html.ActionLink("Text", "Edit", new {controller = "Group", id = "someId"})
会产生一个看起来像这样的链接(注意&#34;组&#34;尽管&#34;组&#34;控制器名称,但是在URL中):
<a href="/Groups/Edit/someId">Text</a>