Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC区域和HTML Slug_Asp.net Mvc_Url_Asp.net Mvc Areas_Asp.net Mvc 5.2 - Fatal编程技术网

Asp.net mvc MVC区域和HTML Slug

Asp.net mvc MVC区域和HTML Slug,asp.net-mvc,url,asp.net-mvc-areas,asp.net-mvc-5.2,Asp.net Mvc,Url,Asp.net Mvc Areas,Asp.net Mvc 5.2,我正在尝试缩短MVC应用程序上的URL(如果可能的话)。我使用我的web应用程序上的区域。目前,我的URL slug正在运行,这个seite帮助了很多: 这是我工作区注册的一部分,注意,{articleTitle}是slug public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Discus

我正在尝试缩短MVC应用程序上的URL(如果可能的话)。我使用我的web应用程序上的区域。目前,我的URL slug正在运行,这个seite帮助了很多:

这是我工作区注册的一部分,注意,{articleTitle}是slug

public override void RegisterArea(AreaRegistrationContext context)
        {       
            context.MapRoute(
                "Discussion_default",
                "Discussion/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );

            context.MapRoute(
                "View_Article",
                "Discussion/Articlev1/Details/{id}/{articleTitle}",
                new { controller = "Articlev1", action = "Details", id = UrlParameter.Optional, articleTitle = "" }
            );
        }
这将生成一个长URL(www.sitename.com/Discussion/Articlev1/Details/id/cool html article)

有没有一种方法可以让它生成并使用以下内容:

www.sitename.com/Articlev1/id/cool-html-article

或者干脆省略下面的细节部分:

www.sitename.com/Discussion/Articlev1/id/cool-html-article


我尝试了一些方法,但没有一种有效,要么产生404个错误,要么产生400.1个错误。这可能吗?

按照路由设置的方式,除非生成URL,否则将永远不会点击
查看文章
路由,因为URL
/Discussion/Articlev1/Details/id/cool html文章
将匹配
讨论
默认路由

首先,将它们按正确的顺序排列():

从那里,只要您注意确保整个配置中没有URL冲突,就可以轻松地将第一个URL更改为您喜欢的任何URL

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "View_Article",
        "Discussion/Articlev1/{id}/{articleTitle}",
        new { controller = "Articlev1", action = "Details", id = UrlParameter.Optional, articleTitle = UrlParameter.Optional }
    );

    context.MapRoute(
        "Discussion_default",
        "Discussion/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}
注意:如果一篇文章的
视图
URL没有
id
,可能也没有意义,因此您不应该使用
id=UrlParameter。在这种情况下是可选的

当然,这意味着如果您的应用程序中有一个名为
ArticleV1Controller
的控制器,则
View\u Article
路由将匹配(并将
id
参数设置为您在URL中传递的操作)。如果您无法接受将
/Details
段硬编码到URL中,那么您需要以另一种方式对其进行区分,例如使用路由约束。以下假设您的ID必须为所有数字:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        name: "View_Article",
        url: "Discussion/Articlev1/{id}/{articleTitle}",
        defaults: new { controller = "Articlev1", action = "Details", articleTitle = UrlParameter.Optional },
        constraints: new { id = @"\d+" }
    );

    context.MapRoute(
        name: "Discussion_default",
        url: "Discussion/{controller}/{action}/{id}",
        defaults: new { action = "Index", id = UrlParameter.Optional }
    );
}

谢谢夜猫子,我现在就去试试。我应该用什么来代替URL.optional?URL。是否需要?-哦,忽略这个问题,我看到第二个问题解决了这个问题现在我有一个问题,我的创建和编辑方法不起作用,我猜是因为那些操作/控制器URL匹配操作/id格式?有没有好办法解决这个问题?如果我在RouteConfig中创建了一个“ignoreroutes”,而忽略了sitename.com/Articlev1/*,会不会造成太多问题?我现在就玩这个…再次感谢你。最后,我在RouteConfig上使用了一个ignoreroute,但如果这被证明太麻烦,那么我将使用约束。我甚至不知道约束。IgnoreRoutes是阻止路由匹配。例如,默认情况下,
/
/Home
/Home/Index
都可以工作,但是如果设置
忽略路由(“Home/Index”)
,它将返回404 not found而不是主页<代码>忽略路由
对路由是否冲突没有影响。
public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "View_Article",
        "Discussion/Articlev1/{id}/{articleTitle}",
        new { controller = "Articlev1", action = "Details", articleTitle = UrlParameter.Optional }
    );

    context.MapRoute(
        "Discussion_default",
        "Discussion/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}
public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        name: "View_Article",
        url: "Discussion/Articlev1/{id}/{articleTitle}",
        defaults: new { controller = "Articlev1", action = "Details", articleTitle = UrlParameter.Optional },
        constraints: new { id = @"\d+" }
    );

    context.MapRoute(
        name: "Discussion_default",
        url: "Discussion/{controller}/{action}/{id}",
        defaults: new { action = "Index", id = UrlParameter.Optional }
    );
}