如何在MVC属性路由中设置控制器的名称?

时间:2016-06-14 21:08:36

标签: c# razor asp.net-mvc-5

描述

我在我的一个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>

问题

  • 这是否会发生,因为控制器的名称可能是未知的?
  • 有没有办法可以使用仅属性路由设置控制器的名称?

2 个答案:

答案 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>