Замените Page.Request в ASP.NET Core 2 - PullRequest
1 голос
/ 21 марта 2019

Я мигрирую проект из Net 4.6.2 в Net Core 2. Что является заменой для запроса в MVC Net Core 2? Как заменить эту строку ниже? string rawId = Request["ProductID"];

В Net Core 2 я получаю

Ошибка:

Cannot apply indexing with [] to an expression of type 'HttpRequest'    HPE.Kruta.Web.Core

https://docs.microsoft.com/en-us/dotnet/api/system.web.httprequest?view=netframework-4.7.2

Пример кода:

protected void Page_Load(object sender, EventArgs e)  
{  
    string rawId = Request["ProductID"];  
    int productId;  
    if (!String.IsNullOrEmpty(rawId) && int.TryParse(rawId, out productId))  
    {  
        using (ShoppingCartActions usersShoppingCart = new ShoppingCar

1 Ответ

0 голосов
/ 21 марта 2019

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(), если ключ отсутствует в словаре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...