当前位置:  开发笔记 > 后端 > 正文

Asp.Net MVC:如何在我的网址中启用短划线?

如何解决《Asp.NetMVC:如何在我的网址中启用短划线?》经验,为你挑选了4个好方法。

我想在我的网址中用破折号分隔单词.所以代替:

/MyController/MyAction

我想要:

/My-Controller/My-Action

这可能吗?



1> ChadT..:

您可以像这样使用ActionName属性:

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

请注意,您需要调用View文件"My-Action.cshtml"(或相应的扩展名).您还需要在任何Html.ActionLink方法中引用"my-action".

控制器没有这么简单的解决方案.

编辑:MVC5的更新

全局启用路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

现在使用MVC5,属性路由已经被吸收到项目中.您现在可以使用:

[Route("My-Action")]

论行动方法.

对于控制器,您可以应用RoutePrefix将应用于该控制器中所有操作方法的属性:

[RoutePrefix("my-controller")]

使用的一个好处RoutePrefix是URL参数也将传递给任何动作方法.

[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....

剪断..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client


@LordofScripts - 确保您已正确配置路由:routes.MapMvcAttributeRoutes();
不错的提示.只是添加:当您使用默认的View()调用执行此操作时,MVC将在Views文件夹中的某处搜索"My-Action.aspx",而不是"MyAction.aspx",除非您明确指定原始名称.

2> Andrew..:

您可以创建一个自定义路由处理程序,如以下博客所示:

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

public class HyphenatedRouteHandler : MvcRouteHandler{
        protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }

......和新路线:

routes.Add(
            new Route("{controller}/{action}/{id}", 
                new RouteValueDictionary(
                    new { controller = "Default", action = "Index", id = "" }),
                    new HyphenatedRouteHandler())
        );

这里提出了一个非常相似的问题:ASP.net MVC支持带有连字符的URL



3> Ata S...:

我已经为这个问题开发了一个开源的NuGet库,它隐式地将EveryMvc/Url转换为每个mvc/url.

大写网址是有问题的,因为Cookie路径区分大小写,大多数互联网实际上区分大小写,而Microsoft技术将网址视为不区分大小写.(更多关于我的博文)

NuGet包:https://www.nuget.org/packages/LowercaseDashedRoute/

要安装它,只需在Visual Studio中打开NuGet窗口,右键单击Project并选择NuGet Package Manager,然后在"Online"选项卡上键入"Lowercase Dashed Route",它就会弹出.

或者,您可以在程序包管理器控制台中运行此代码:

Install-Package LowercaseDashedRoute

之后你应该打开App_Start/RouteConfig.cs并注释掉现有的route.MapRoute(...)调用并添加它:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

而已.所有的网址都是小写,虚线和隐式转换,而不需要你做更多的事情.

开源项目网址:https://github.com/AtaS/lowercase-dashed-route



4> Daniel Eagle..:

这是我使用ASP.NET MVC 5中的区域所做的,它的工作很有魅力.我也没有必要重新命名我的观点.

在RouteConfig.cs中,执行以下操作:

 public static void RegisterRoutes(RouteCollection routes)
    {
        // add these to enable attribute routing and lowercase urls, if desired
        routes.MapMvcAttributeRoutes();
        routes.LowercaseUrls = true;

        // routes.MapRoute...
    }

在控制器中,在类定义之前添加:

[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
    // ...

    [Route("my-action")]
    public ViewResult MyAction()
    {
        // do something useful
    }
}

如果在本地计算机上进行测试,则显示在浏览器中的URL为:localhost/sample-area/my-action.您无需重命名视图文件或任何内容.我对最终结果非常满意.

启用路由属性后,您可以删除所有区域注册文件,例如SampleAreaRegistration.cs.

这篇文章帮助我得出了这个结论.我希望它对你有用.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有