0

これは、私が実行している別のスレッドであるReading cookie in c#のフォローアップです。ただし、その投稿の回答はブッシュの周りを打ち負かしているように見えるので、ここで質問を簡単にしたいと思います。これに答えれば、その問題を解決できると思います。Cookie を読み込もうとしてほぼ 2 日間立ち往生しているので、助けていただければ幸いです。

この行で何が NullReferenceException を引き起こす可能性がありますか:

HttpCookie aCookie = Request.Cookies["UserSettings"];

開発者ツールバーで確認できるように、「UserSettings」という Cookie があるはずです。Request または Request.Cookies は null でなければなりませんよね?

Request.Cookies を使用できないのはなぜですか? 私が見ているすべてのクッキーチュートリアルは、そのようにしています.

編集: index.aspx に Cookie 作成コードを追加しました。ところで、HomeController.cs で Cookie を読み込もうとしています。

<script type="text/javascript">
    function setLanguage() {
    cname = "language";
    cvalue =           document.getElementById('language').options[document.getElementById('language').selectedInd    ex].value;
    cexpire = new Date();
    cexpire.addDays(1);
    document.cookie = cname + '=' + escape(cvalue) +
(typeof cexpire == 'date' ? 'expires=' + cexpire.toGMTString() : '') +
',path=/;';
}
</script>
4

1 に答える 1

3

これは、Cookie を追加する場所ではありません。ユーザー設定について話している場合、特に Cookie を追加する場所ではありません。ユーザー設定は通常、ユーザーの操作によって確立されます。たとえば、ユーザーはドイツ語のリンクをクリックしてドイツ語の設定に切り替えます。これは、このコントローラー メソッド、イベント、またはアプリケーションが応答に Cookie を設定し、その永続性を確立する必要があるクリック動作を処理している場合です。

また、いくつかのことを覚えておいてください。このメソッドでは、この Cookie をすべてのresponseに追加しています。後続のコントローラー呼び出しhc.getLang()では、Cookie から言語を取得するためにリクエストにアクセスしています。最初の呼び出しでは、Cookie がまだリクエストに含まれていないため、これは常に null になります。応答に追加しただけです。ただし、次の呼び出しでは Cookie が存在するはずですが、リクエストごとに強制しているため、言語が「nl」に設定された状態で常に存在します。

この global.asax イベントから Cookie 生成コードを取り出し、それを設定するインターフェイス (リンク、ボタンなど) を使用するページに配置することをお勧めします。その後、コントローラーはその時点からリクエスト Cookie にアクセスできるようになります。Web フォームであるか MVC であるかに関係なく、ページのライフサイクル中、リクエストとレスポンスは完全に別のオブジェクトであることに常に注意してください。

編集: コントローラーの使用について言及しているため、MVCを使用していると想定しているため、コードサンプルをその流れで動作するようにターゲットにします。で Cookie を設定することApplication_BeginRequestは悪い魔法であることが確立されているため、ユーザー アクションを参照して、アプリケーションの別のポイントでそれを確立する必要があります。というコントローラーがSettingsControllerあり、 というアクションがあるとしSetLanguageます。

[Authorize]
public class SettingsController : Controller
{

    // ... skipping other constructor and method code

    [Authorize]
    [HttpPost]
    public ActionResult SetLanguage(MyLanguageModel model)
    {
        HttpCookie myCookie = new HttpCookie("UserSettings");
        myCookie.Value = model.AssignedLanguage;
        myCookie.Expires = DateTime.Now.AddDays(1);
        Response.Cookies.Add(myCookie);

        return View(model);
    }

}

AssignedLanguageこれは、モデルからプロパティを取得し、それを使用して即時リクエストの言語を決定するようにビューが記述されていることを前提としています。ただし、後続のすべてのリクエストは UserSettings Cookie にアクセスできる必要があります。Request.Cookies["UserSettings"]この時点で、後続のリクエストでリクエスト パイプライン内のどこからでも呼び出すことができるはずです。

于 2012-06-14T12:58:12.713 に答える