1

MVCのURLを次のようにしたいと思います。

http://www.site.com/project/id/projectname

例:

http://www.site.com/project/5/new-website

私のコントローラーは:

public ActionResult Details(int id, string projectname)

私のアクションリンクは次のとおりです。

@Html.ActionLink("click here", "Details", "Project", new { id = project.ProjectID, projectname = project.ProjectName })

そして私のルートは:

routes.MapRoute(
    "Project",
    "project/{id}/{projectname}",
    new { controller = "Project", action = "Details", id = "", projectname = "" }
    );

確かに、システムには十分な情報があり、プロジェクト名がUrlの一部になることを知っているので、リンクをUrlEncodeして、スペースをハイフンに置き換える必要がありますか?しかし、そうではないので、スペースは%20になります

これをどこでカスタマイズするかわかりませんか?Html.ActionLinkをオーバーライドしますか?編集のたびにデータベースに「URL対応」バージョンの名前を保存することは、その場で自動的に実行する必要がある場合、そのような無駄のように思えます。また、Html.ActionLinkを使用するたびに「FriendlyURL」関数を呼び出す必要はありません。これも、自動的に処理される必要があります。

4

1 に答える 1

1

スペース文字をに変更するの%20 、URLエンコードの結果です。スペース文字をURLエンコードすると、ハイフンに変換されません。もしそうなら、URLエンコードされたときにハイフンは何に変換されると思いますか?

@ RK911が指摘しているように、あなたがしたいのはスラッグを作成することです。

これを行うにはいくつかの方法があります。

1.)スペースを許可しないようにデータを制限projectnameし、ハイフンのみを許可します(データ入力時にデータの検証を使用する可能性があります)。

2.)スラッグをデータベースに個別に保存しますprojectslug

3.)これを「オンザフライ」で実行する拡張メソッドを作成します。

@ RK911が参照したリンクを使用した#3の例を次に示します。

public static class SlugExtensions
{
    public static string AsSlug(this string phrase) 
    { 
        string str = phrase.RemoveAccent().ToLower(); 
        // invalid chars           
        str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); 
        // convert multiple spaces into one space   
        str = Regex.Replace(str, @"\s+", " ").Trim(); 
        // cut and trim 
        str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim();   
        str = Regex.Replace(str, @"\s", "-"); // hyphens   
        return str; 
    } 

    private static string RemoveAccent(this string txt) 
    { 
        byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt); 
        return System.Text.Encoding.ASCII.GetString(bytes); 
    }
}

@Html.ActionLink("click here", "Details", "Project",
    new { id = project.ProjectID,
    projectname = project.ProjectName.AsSlug() })
于 2013-03-23T06:06:53.253 に答える