Asp.Net MVC ActionLink、RedirectToAction などを使用するときにフラグメント識別子を含める方法はありますか? 質問する

Asp.Net MVC ActionLink、RedirectToAction などを使用するときにフラグメント識別子を含める方法はありますか? 質問する

いくつかのリンクにフラグメント識別子を含めたいと思います。このサイトのいくつかの URL のように:

デバッグ: IE6 + SSL + AJAX + 投稿フォーム = 404 エラー#5626

MVC の組み込みメソッドのいずれかを使用してこれを行う方法はありますか? それとも、独自の HTML ヘルパーを作成する必要がありますか?

ベストアンサー1

Brad Wilson が書いたように、文字列を連結するだけでビュー内に独自のリンクを構築できます。ただし、RedirectToAction (または同様のもの) で生成されたリダイレクトにフラグメント名を追加するには、次のようなものが必要になります。

public class RedirectToRouteResultEx : RedirectToRouteResult {

    public RedirectToRouteResultEx(RouteValueDictionary values)
        : base(values) {
    }

    public RedirectToRouteResultEx(string routeName, RouteValueDictionary values)
        : base(routeName, values) {
    }

    public override void ExecuteResult(ControllerContext context) {
        var destination = new StringBuilder();

        var helper = new UrlHelper(context.RequestContext);
        destination.Append(helper.RouteUrl(RouteName, RouteValues));

        //Add href fragment if set
        if (!string.IsNullOrEmpty(Fragment)) {
            destination.AppendFormat("#{0}", Fragment);
        }

        context.HttpContext.Response.Redirect(destination.ToString(), false);
    }

    public string Fragment { get; set; }
}

public static class RedirectToRouteResultExtensions {
    public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) {
        return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) {
            Fragment = fragment
        };
    }
}

そして、コントローラーで次のように呼び出します。

return RedirectToAction("MyAction", "MyController")
       .AddFragment("fragment-name");

そうすれば URL が正しく生成されるはずです。

おすすめ記事