【问题标题】:Controller action with multiple parameters具有多个参数的控制器动作
【发布时间】:2018-05-16 07:44:08
【问题描述】:

我试图了解 我认为 是我的 ASP.NET Core 项目中的模型绑定问题。我有以下“索引”控制器操作:

[HttpGet]
public async Task<IActionResult> Index(SortFilterIndexOptions options) { ... }

SortFilterIndexOptions 是以下类中定义的四个成员:

public class SortFilterIndexOptions
{
    public int SelectedBirdId { get; set; }
    public bool ShowAll { get; set; }
    public bool ShowInTable { get; set; }
    public int page { get; set; }
}

这些使用户能够过滤分页索引页面。 bool 成员链接到复选框控件。

如果将“ShowAll”布尔成员更改为 TRUE,然后尝试导航到不同的页面,我会遇到错误。正如下面的屏幕截图所示,url 的“ShowAll”参数部分包含两个布尔值(“ShowAll=true, false”):

这当然会导致解析错误(“FormatException:字符串未被识别为有效的布尔值”)。

这里发生了什么?它仅在“ShowAll”参数切换为 TRUE 时发生。是否是路由问题,因为它不遵循默认路由模式?还是 ModelBinder 有问题?我只是想了解发生了什么,以便采取正确的行动。任何帮助将不胜感激...

更新

这现在是 asp/Home GitHub 存储库上的问题 #3246('ModelBinding error with boolean values')(最初由我在 dotnet/Core 存储库中作为问题 #1711 提出)。

【问题讨论】:

  • 错误信息很清楚...ShowAll=true,false 作为布尔值无效。应该只使用ShowAll=true
  • 这是通过 GET 发送的表单中的复选框吗?
  • 是的,我正在尝试弄清楚为什么它添加了两个布尔值。当我单击下一页按钮时。发生这种情况时 ShowAll 被切换为 true。为什么要在 url 中附加第二个“false”值?
  • @CodeCaster。它是一个 Bootstrap Toggle 控件。所以和复选框一样。在 GET 表单中

标签: c# asp.net-core asp.net-core-routing


【解决方案1】:

错误消息非常清楚...ShowAll=true,false 作为布尔值无效。

模型绑定器从该参数的查询字符串接收以下字符串"true,false",然后尝试将其解析为布尔值,如您所见,这将失败。

类似于尝试

bool value = bool.Parse("true,false");

应该只使用ShowAll=true

【讨论】:

  • @CodeCaster 我现在想知道核心中的模型绑定器是否具有该功能?
  • 好吧,我知道核心喜欢破坏很多东西,但是像表单上的复选框这样基本的东西......?
  • 是的,这看起来很奇怪。我将更改为枚举值的下拉列表,看看它是否有效。要尝试查看故障是否与复选框隔离...正如我所提到的,可以浏览复选框的不同页面,将其保留为假。当一个切换到 true 时它会中断......
  • 我用下拉列表替换了复选框,模型绑定问题得到解决。这表明问题是由带有复选框的 ModelBinder 引起的。我会把这个问题留一会儿,看看是否有人可以添加任何东西......
【解决方案2】:

aspnet/Mvc 团队在 issue #8043 下调查了此问题。

ModelBinder 没有问题。问题是由我的寻呼机代码引起的,它构造了 url。请使用link查看完整对话,其中包含来自aspnet/Mvc团队的详细解释和我提供的示例代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多