首页 > 解决方案 > 替换 ASP.NET Core 2 中的 Page.Request

问题描述

我正在将项目从 Net 4.6.2 迁移到 Net Core 2。MVC Net Core 2 中 Request 的替代品是什么?如何替换下面的这一行? 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

标签: c#asp.net-core

解决方案


ASP.NET WebForms 不能直接转换为 ASP.NET MVC 和 ASP.NET Core,因为“Web 表单”范式不能很好地转换为 ASP.NET MVC 中使用的控制器+动作+模型+绑定系统。我建议您先阅读以下其他 QA:

HttpRequest对象将两者QueryStringForm值结合在一起,但这是一个糟糕的设计,现在您需要明确检查一个或另一个(或两者),以便您确切知道值的来源。

但是,如果您有一个查询字符串值,则应该将其设为控制器操作参数,而不是使用该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 );
}

但是,如果您仍然希望将原始查询字符串或发布的表单值作为其原始字符串值访问,那么就这样做。

请注意,FormandQuery不再是NameValueCollection对象,而是更正确地公开“单键多值”数据的强类型类。所以这样做以获得"ProductId"像以前一样的值:

String rawId = this.Request.Form["ProductId"].FirstOrDefault() ?? this.Request.Query["ProductId"].FirstOrDefault();

因为每个Form条目StringValues不是String您需要始终使用FirstOrDefault()来获取单个字符串值(不要使用SingleOrDefault(),因为如果同一个键存在 2 个或多个值,它将引发异常)。其次,??如果命名值不存在于发布的值中,操作员将使程序Form首先检查查询字符串。

如果在任一集合中都找不到指定的键,则 and 集合会返回,因此如果Form字典QueryStringValues.Empty不存在该键,则不会使用扩展方法冒险。nullNullReferenceExceptionFirstOrDefault()


推荐阅读