为啥此代码给我来自 Request.Form 的无效内容类型? (ASP.NET 核心)

Posted

技术标签:

【中文标题】为啥此代码给我来自 Request.Form 的无效内容类型? (ASP.NET 核心)【英文标题】:Why is this code giving me invalid content type from Request.Form? (ASP.NET Core)为什么此代码给我来自 Request.Form 的无效内容类型? (ASP.NET 核心) 【发布时间】:2018-02-05 06:18:53 【问题描述】:

这是使用 RazorPages 的 ASP.NET Core 2.0 OnGet 方法。

cs 文件:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace CoreRazor2.Pages

  public class IndexModel : PageModel
  
    [BindProperty]
    public int result  get; set; 
    public void OnGet(string operationType)
    
      string result;
      switch (operationType)
      
        case "+":
          result = Request.Form["First"];
          break;
        case "-":
          result = "1";
          break;
        case "/":
          result = "2";
          break;
        case "*":
          result = "3";
          break;
      

    
  

cshtml文件:

@page
@model IndexModel
@
    ViewData["Title"] = "Calculator";


<form method="GET">
<label>First Value: </label>
<input name="First"/>
<br/>
<br/>
<label>Second Value: </label>
<input name="second"/>
<br/>
<br/>
<input type="submit" name="operationType" value="+"/>
<input type="submit" name="operationType" value="-"/>
<input type="submit" name="operationType" value="*"/>
<input type="submit" name="operationType" value="/"/>
</form>
@Model.result

当在第一个表单输入中输入一个值并单击“+”提交按钮时,程序在Request.Form[“First”]处抛出以下异常:

Exception has occurred: CLR/System.InvalidOperationException
An exception of type 'System.InvalidOperationException' occurred in Microsoft.AspNetCore.Http.dll but was not handled in user code: 'Incorrect Content-Type: '
   at Microsoft.AspNetCore.Http.Features.FormFeature.ReadForm()
   at Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest.get_Form()
   at CoreRazor2.Pages.IndexModel.OnGet(String operationType) in c:\Users\Administrator\Desktop\CoreRazor2\Pages\Index.cshtml.cs:line 17
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.ExecutorFactory.VoidHandlerMethod.Execute(Object receiver, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.<InvokeHandlerMethodAsync>d__29.MoveNext()

有没有人知道为什么或可以向我指出一些有用的文档?

【问题讨论】:

【参考方案1】:

当您需要处理所有类型的 HttpRequest 时,出于通用目的(如日志记录),请使用 HttpRequest.HasFormContentType

示例代码:

if (request.HasFormContentType && request.Form != null && request.Form.Count() > 0)

            dynamic form = new  ;
            foreach (var f in request.Form)
                form[f.Key] = f.Value;
            d.form = form;

【讨论】:

你救了我的一天,谢谢【参考方案2】:

基于 GET 的表单通过 URL 而不是表单传递值。您需要使用Request.Query["First"]。 Request.Form 仅在您发布表单时有效。但由于您使用的是 Razor Pages,因此您可以省去所有麻烦,只需使用模型绑定:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace CoreRazor2.Pages

    public class IndexModel : PageModel
    
        public int Result  get; set; 

        public void OnGet(string operationType, int first, int second)
        
            switch (operationType)
            
                case "+":
                    Result = first + second;
                    break;
                case "-":
                    Result = first - second;
                    break;
                case "/":
                    Result = first / second;
                    break;
                case "*":
                    Result = first * second;
                    break;
            

        
    

【讨论】:

如果我们需要接收POST数据怎么办? 然后添加一个 OnPost 方法。【参考方案3】:

我觉得应该是

Request.Query["First"]

而不是

Request.QueryString["First"]

否则我会得到

无法将带有 [] 的索引应用于“QueryString”类型的表达式

【讨论】:

以上是关于为啥此代码给我来自 Request.Form 的无效内容类型? (ASP.NET 核心)的主要内容,如果未能解决你的问题,请参考以下文章

我用ckEditor+ckFinder上传图片,保存时为啥报错从客户端中检测到有潜在危险的Request.Form值,

我想知道为啥 request.form 为空

无法使用来自axios请求的request.form在flask api中获取请求正文[重复]

经典的ASP Request.Form在使用集成管道时无法正常工作

为啥不将其添加到数据库中?

MVC 4 - Razor - “从客户端检测到一个潜在危险的request.form值”