替换ASP.NET Core 2中的Page.Request

时间:2019-03-20 23:16:13

标签: c# asp.net-core

我正在将项目从Net 4.6.2迁移到Net Core 2。 MVC Net Core 2中的Request的替代品是什么?如何在下面替换此行? interface MyFoo { foo1: (number) => void; foo2: (string) => void; } class Bar<Foo> { public boom<T extends Foo, K extends keyof MyFoo>(first: K, ...args: Parameters<T[K] /* here I don't know how to declare this parameter */){ } } new Bar<MyFoo>().boom("foo1", /* callback with signature: (number) => void */)

我在Net Core 2中收到

错误:

string rawId = Request["ProductID"];

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

代码示例:

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

1 个答案:

答案 0 :(得分:1)

ASP.NET WebForms不能直接转换为ASP.NET MVC和ASP.NET Core,因为“ Web表单”范例不能很好地转换为ASP.NET MVC中使用的controller + action + model + binding系统。我建议您先阅读以下其他质量检查:

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

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

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

请注意,FormQuery是不再更长的NameValueCollection对象,而是类型更强的类,它们可以更正确地正确显示“单键,多个值”数据。因此,执行此操作即可像以前一样获得"ProductId"值:

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

由于每个Form都是StringValues而不是String,因此您需要始终使用FirstOrDefault()来获取单个字符串值(不要使用SingleOrDefault()因为如果同一键存在2个或多个值,它将抛出异常)。其次,如果首先在发布的??值中没有指定的值,Form运算符将使程序检查查询字符串。

如果FormQuery集合在两个集合中均未找到指定的键,则返回StringValues.Empty而不是null,因此不会冒{{1} },如果字典中没有密钥,请使用NullReferenceException扩展方法。