14

asp.net mvcでクエリ文字列値を永続化する良い方法は何ですか?

URL がある場合: /questions?page=2&sort=newest&items=50&showcomments=1&search=abcd

ページング リンクでは、これらのクエリ文字列の値をすべてのリンクに保持して、たとえばユーザーが「次のページ」をクリックしたときに保持されるようにしたい (この場合、ページの値は変更されますが、残りは同じままです)。

これを行うには2つの方法が考えられます:

  1. ビューで Request.Querystring を表示し、値をリンクに追加します
  2. ViewData を使用して、コントローラーからビューに各クエリ文字列値を渡します。

一方が他方よりも優れていますか?それらが唯一のオプションですか、それともこれを行うためのより良い方法はありますか?

4

4 に答える 4

8

私はそのために拡張メソッドを使用します:

public static string RouteLinkWithExtraValues(
        this HtmlHelper htmlHelper,
        string name,
        object values)
    {
        var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values);

        var extraValues = new RouteValueDictionary(values);
        foreach (var val in extraValues)
        {
            if (!routeValues.ContainsKey(val.Key))
                routeValues.Add(val.Key, val.Value);
            else
                routeValues[val.Key] = val.Value;
        }

        foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form)
        {
            routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key];
        }

        foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString)
        {
            if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "")
                routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key];
        }

        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);

        return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name);
    }
于 2009-05-20T20:24:31.047 に答える
7

コントローラーから渡すのではなく、ビューで QueryString を処理します (オプション #1)。このアプローチにより、ビューがより自己完結型になり、ビュー コントロールに変換して、さまざまなビューで再利用できるようになります。

注: ビューで直接 QueryString にアクセスすることは、モデルとビューを分離するという設計原則に違反しているように見えるかもしれませんが、実際には、このデータはビューに関連するナビゲーションの問題であり、実際にはモデルの一部ではありません。

于 2009-05-20T20:57:09.937 に答える
1

ページングリンクだけが持つ必要があるように、セッションに値を保持するだけです。

/質問?page=2

/質問?page=3

QueryString を使用しない理由の 1 つは、プログラムに渡す値をユーザーに見られたくないからです。アドレスバーに移動して値を変更し始めて「何が起こるかを確認する」のは簡単すぎます。このコードでできることは、ページ番号を変更することだけです。

于 2009-05-20T20:07:43.720 に答える