Convert.ToInt32
просто возвращает int
, а не int?
- поэтому тип выражения:
size ?? Convert.ToInt32(...)
имеет тип int
.Вы не можете использовать необнуляемый тип значения в качестве первого операнда выражения оператора с нулевым слиянием - он не может быть нулевым, поэтому второй операнд (в данном случае 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 винвариантная культура, поскольку на самом деле она не предназначена для того, чтобы быть видимой для пользователя или чувствительной к культуре.Вы должны убедиться, что вы сохранили куки-файл, используя также инвариантную культуру.
В любом случае, при наличии метода расширения (в статическом неуниверсальном классе верхнего уровня), вы можете использовать:
size = size ?? Request.Cookies.GetInt32OrNull("StoriesPageSize") ?? 10;