如何在使用 AspNet.FriendlyUrls 时添加自定义友好 URL?

how to add a custom friendly URL while using AspNet.FriendlyUrls?

提问人:Mohamed 提问时间:4/25/2023 最后编辑:Mohamed 更新时间:4/25/2023 访问量:112

问:

我需要你的帮助; 我正在使用 c# 开发一个 asp.net Web 应用程序 我使用Microsoft AspNet FriendlyUrls制作没有后缀aspx的url 在App_Code>App_start中,我添加了以下类

public static class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        var settings = new FriendlyUrlSettings();
        settings.AutoRedirectMode = RedirectMode.Permanent;
        routes.EnableFriendlyUrls(settings,new WebMethodFriendlyUrlResolver());
    }

    public class WebMethodFriendlyUrlResolver : WebFormsFriendlyUrlResolver
    {
        public override string ConvertToFriendlyUrl(string path)
        {
            if (HttpContext.Current.Request.PathInfo != string.Empty)
            {
                return path;
            }
            else
            {
                return base.ConvertToFriendlyUrl(path);
            }
        }
    }
}

在 Global.asax 中,我使用了以下代码

void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup

        RouteConfig.RegisterRoutes(System.Web.Routing.RouteTable.Routes);
        
    }

它可以很好地从 URL 中删除 aspx 部件 现在。。。。。。。。。。 我有一个搜索页面在 url 中使用了 3 个参数,例如(Plumber,Cairo,Dar Elsalam)

.../search/find?Syx=job=Plumber%20+%20state=CAIRO%20+%20city=ELSALAM%20DAR%20+%20

如何使 Up URL 成为

.../search/plumber-in-dar-elsalam

我将不胜感激你的想法

我在互联网上搜索解决方案,但找不到适合我的情况的解决方案

我试过这段代码

routes.MapPageRoute("plum-darelsalam", "plumber-in-dar-elsalam", "~/find?Syx=job=Plumber%20+%20state=CAIRO%20+%20city=ELSALAM%20DAR%20+%20.aspx");

routes.EnableFriendlyUrls(settings,new WebMethodFriendlyUrlResolver());

但没有用 ☹️

C# asp.net 友好网址

评论

0赞 madreflection 4/25/2023
它怎么会知道这应该变成你是怎么“进来”的?“开罗”怎么了?“ELSALAM DAR”是如何变成“dar-elsalam”的?重定向本身很简单,但这种额外的语义转换是你必须首先单独弄清楚的事情。专注于此。"job=Plumber + state=CAIRO + city=ELSALAM DAR + ""plumber-in-dar-elsalam"
0赞 Mohamed 4/25/2023
@madreflection感谢您的评论;如果不能动态完成,有没有办法将“job=Plumber + state=CAIRO + city=ELSALAM DAR + ”转换为“plumber-in-dar-elsalam”?
0赞 madreflection 4/25/2023
当然,也许吧,但你可能不得不自己写。它似乎非常特定于您的用例。如果你正在寻找预先包装的东西,我会说你不会找到它。

答:

0赞 Albert D. Kallal 4/25/2023 #1

好吧,有了这个 URL
/search/findSyx=job=Plumber%20+%20state=CAIRO%20+%20city=ELSALAM%20DAR%20+%20

../search/find?Syx=job=Plumber%20+%20state=CAIRO%20+%20city=ELSALAM%20DAR%20+%20

作为一个友好的 URL,它将成为:

/search/job/Plumber/Cario/Elalam dar

(或至少接近上述)。

so for say
/Projects?QuoteNum=123456

您可以拥有:

 /Projects/QuoteNum/123456

甚至

 /Projects/Quotes/123456

请注意,在上面,假设基本页面是“项目”,那么你可以随心所欲地制作一些不错的链接。你甚至可以有这个:

 /Projects/123456

但是,“大多数情况下”最好包括“事物”是什么,所以

  /Projects/Invoices/123456

请注意,您决定拥有的“额外”值或关键字 100% 由您决定。

现在是 WHOPPER 部分!!!

.net 不会自动更改您拥有的旧样式 URL,新格式也不会起作用我的一些魔术。你,开发人员,现在必须抓住并使用这些新价值。

因此,代码将如下所示:

for the page Projects.aspx, as per above examples, then you can do this in code behind:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {

            // first page load, get friendly URL parts
            IList<string> fURL = new List<string>();
            fURL = Request.GetFriendlyUrlSegments();    

            if (fURL.Count == 2)
            {
                // 2 values in URL, 

                switch (fURL[0])
                {
                    case "Quote":
                        string sQuoteNumber = fURL[1];
                        // code here for getting quote number
                        break;

                    case "Invoice":
                        string sInvoiceNumber = fURL[2];
                        // code here for invoice number
                        break;
                }
            }

因此,不会自动将“旧样式”参数转换为新样式,您必须编写代码来使用和处理 URL 参数的新样式。(这将需要您编写新代码)。

所以,在上面,你可以说使用这个:

 Projects/Quotes/123456

 Projects/Invoices/2345

当然,真正好的是用户不会想到参数,但不仅会看到一个漂亮干净的链接,而且会看到一个看起来像“文件夹”的链接,他们也可以共享这样的链接。

虽然用户可以“弄乱”参数,但它们很难,但友好的 URL 非常好,他们通常会开始使用它们来获取给定的报价,甚至分享此类链接。

因此,作为带有参数的旧式 URL,您可能有这个:

  Projects?State="New York"&Quote=12345

以上现在变成了

 Projects/New York/12345

或者也许

 Projects/New York/Quotes/12345

因此,您可以制作出非常好的 URL,但是您作为开发人员将不得不使用 GetFriendlyUrlSegments 获取/抓取/处理/使用/编写代码,并且不会发生一些自动或自动魔术转换。

您当然可以同时支持这两种类型的 URL 参数。这意味着您必须保留现有的旧样式代码,然后为新类型的参数添加额外的新代码 - 它们不是“一对一”或可互换的。