ASP.NET WebForms не может напрямую преобразовываться в ASP.NET MVC и ASP.NET Core, потому что парадигма «веб-формы» плохо подходит для системы привязки «контроллер + действие + модель +», используемой в ASP.NET MVC. Я рекомендую вам сначала прочитать эти другие вопросы:
Старый объект HttpRequest
объединил вместе значения QueryString
и Form
, но это плохой дизайн, и теперь вам нужно явно проверять одно или другое (или оба), чтобы вы точно знали, куда приходит значение с.
Однако, если у вас есть значение строки запроса, вы должны сделать это параметром действия контроллера вместо использования объекта Request
. Вы можете использовать строго типизированные значения (например, Int32
вместо String
, поэтому вам не нужно выполнять проверку и преобразование самостоятельно. Например, так:
public async Task<IActionResult> GetShoppingCart( [FromQuery] Int32 productId )
{
ShoppingCart cart = await this.db.GetShoppingCartAsync( productId );
ShoppingCartViewModel vm = new ShoppingCartViewModel()
{
Cart = cart
};
return this.View( model: vm );
}
Однако, если вы по-прежнему предпочитаете обращаться к необработанным строкам запроса или опубликованным значениям формы в качестве их исходных строковых значений, сделайте это так.
Обратите внимание, что Form
и Query
больше не являются NameValueCollection
объектами, а более строго типизированными классами, которые правильно отображают данные "один ключ, несколько значений" более корректно. Так что сделайте это, чтобы получить значение "ProductId"
, как раньше:
String rawId = this.Request.Form["ProductId"].FirstOrDefault() ?? this.Request.Query["ProductId"].FirstOrDefault();
Поскольку каждая запись Form
имеет значение StringValues
вместо String
, вам всегда нужно использовать FirstOrDefault()
, чтобы получить одно строковое значение (не используйте SingleOrDefault()
, потому что оно вызовет исключение, если 2 или более значения присутствуют для одного и того же ключа). Во-вторых, оператор ??
заставит программу проверить строку запроса, если указанное значение не присутствует в опубликованных значениях Form
.
Коллекции Form
и Query
возвращают StringValues.Empty
вместо null
, если указанный ключ не найден ни в одной из коллекций, поэтому вы не рискуете NullReferenceException
, используя метод расширения FirstOrDefault()
, если ключ отсутствует в словаре.