1

ページにページ付けを作成しようとしています。ユーザーはページごとに表示されるアイテムの数を選択でき、希望のサイズがCookieとして保存されます。しかし、querystringパラメーターとcookieのどちらかを選択しようとすると、エラーが発生しました。

    public ActionResult Index(string keyword, int? page, int? size)
    {
        keyword = keyword ?? "";
        page = page ?? 1;

        //Operator "??" cannot be applied to operands of type "int" and  "int"
        size = size ?? Convert.ToInt32(Request.Cookies.Get("StoriesPageSize").Value) ?? 10; 

このエラーの原因は何ですか?それを修正する方法は?

4

2 に答える 2

6

Convert.ToInt32int-ではなく、を返すだけint?なので、式のタイプは次のようになります。

size ?? Convert.ToInt32(...)

タイプintです。null合体演算子式の最初のオペランドとしてnull不可能な値型を使用することはできません。nullになることはできないため、2番目のオペランド(この場合は10)を使用することはできません。

Cookieを使おうStoriesPageSizeしているが、それが存在するかどうかわからない場合は、次を使用できます。

public ActionResult Index(string keyword, int? page, int? size)
{
    keyword = keyword ?? "";
    page = page ?? 1;

    size = size ?? GetSizeFromCookie() ?? 10;
}

private int? GetSizeFromCookie()
{
    string cookieValue = Request.Cookies.Get("StoriesPageSize").Value;
    if (cookieValue == null)
    {
        return null;
    }
    int size;
    if (int.TryParse(cookieValue, CultureInfo.InvariantCulture, out size))
    {
        return size;
    }
    // Couldn't parse...
    return null;
}

コメントで述べたように、これをより一般的に利用できるようにする拡張メソッドを書くことができます。

public static int? GetInt32OrNull(this CookieCollection cookies, string name)
{
    if (cookies == null)
    {
        throw ArgumentNullException("cookies");
    }
    if (name == null)
    {
        throw ArgumentNullException("name");
    }
    string cookieValue = cookies.Get(name).Value;
    if (cookieValue == null)
    {
        return null;
    }
    int size;
    if (int.TryParse(cookieValue, CultureInfo.InvariantCulture, out size))
    {
        return size;
    }
    // Couldn't parse...
    return null;
}

不変のカルチャを使用するようにコードを変更したことに注意してください。実際にはユーザーに表示されたり、カルチャに依存したりすることを意図していないため、不変のカルチャでCookie内の情報を伝播することは理にかなっています。不変のカルチャも使用してCookieを保存するようにしてください。

とにかく、(静的な非ジェネリックトップレベルクラスで)拡張メソッドを配置すると、次を使用できます。

size = size ?? Request.Cookies.GetInt32OrNull("StoriesPageSize") ?? 10;
于 2011-12-19T07:59:38.930 に答える