c# - 替换 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
解决方案
ASP.NET WebForms 不能直接转换为 ASP.NET MVC 和 ASP.NET Core,因为“Web 表单”范式不能很好地转换为 ASP.NET MVC 中使用的控制器+动作+模型+绑定系统。我建议您先阅读以下其他 QA:
旧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
andQuery
不再是NameValueCollection
对象,而是更正确地公开“单键多值”数据的强类型类。所以这样做以获得"ProductId"
像以前一样的值:
String rawId = this.Request.Form["ProductId"].FirstOrDefault() ?? this.Request.Query["ProductId"].FirstOrDefault();
因为每个Form
条目StringValues
不是String
您需要始终使用FirstOrDefault()
来获取单个字符串值(不要使用SingleOrDefault()
,因为如果同一个键存在 2 个或多个值,它将引发异常)。其次,??
如果命名值不存在于发布的值中,操作员将使程序Form
首先检查查询字符串。
如果在任一集合中都找不到指定的键,则 and 集合会返回,因此如果Form
字典Query
中StringValues.Empty
不存在该键,则不会使用扩展方法冒险。null
NullReferenceException
FirstOrDefault()
推荐阅读
- r - 错误:数值表达式有 6 个元素:只有第一个使用的和 GA 中的警告
- angular - 将vasturiano / `sunbrust-chart` 与 Angular 2-9 集成
- ios - 无法将 Bool 类型的值分配给类型 String 数据库表示
- windows - 通过 Windows 上的文件和管道模拟键盘输入到批处理文件
- python - AWS 实时视频中的人体检测
- django - 如何使用 django 应用程序与外部服务器通信?
- django - 如何根据 Django 模型上的其他字段为字段生成 aa 值?
- java - 无法在 Java MIDI 程序中更改乐器,InvalidMidiDataException:channel out of range
- java - 休眠中的递归查询
- react-native - WatermelonDB - 执行批量插入时出错