c# - 为什么默认模型绑定器的行为不同?
问题描述
我正在创建具有以下 url 的 API
/api/abc/?q=1&a=2&b=3&b=4
^^^^^^^
Input.cs(ModelBinding 中使用的类)
...
public string A { get; set; }
public string B { get; set; }
public string Q { get; set; }
...
我正在使用.NET的默认ModelBinding,但问题是当我通过上面的url时,以下值被分配给属性
obj.A = "2" // here obj is object of Input class
obj.B = "3"
obj.Q = "1"
我期待obj.B = "3,4"
(当我在做Request.QueryString [“b”]时,它给出的输出为“3,4”),但它只绑定第一个值。
为什么会发生这种情况?(我不知道默认 ModelBinding 的内部结构,但我猜想它在某处使用 Request.QueryString 进行绑定)。
谁能告诉我为什么会这样,我怎样才能得到“3,4”作为 obj.B 值?
我为 B 获得“3,4”的方法是
使用自定义模型活页夹我做了以下
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
object model = base.BindModel(controllerContext, bindingContext);
var obj = model as Input;
obj.B = Request.QueryString["b"];
}
解决方案
您正在发送多个值,B
这意味着您需要创建B
一个集合。请注意,DefaultModelBinder
如果您的属性不是,则绑定第一个匹配的名称/值对并忽略其余部分IEnumerable
。
将属性更改为
public IEnumerable<string> B { get; set; }
它将包含两个值(如果你真的想要3,4
,你可以String.Join
在数组上使用)。
推荐阅读
- jquery - Jquery点击事件中的水平滚动问题
- permissions - 如何为 Kubernetes 中的共享卷授予完全权限
- java - 在 OpenJDK 中哪里可以找到使用 Launch4j 打包 JavaFX 应用程序所需的 JRE 文件
- ruby-on-rails - 如何使用 RSpec 测试 Sidekiq 工作人员?
- php - PHP调用函数进行输入
- ionic3 - 如何使用 Ionic 3 修复图像滚动缓慢/断断续续的问题?
- python - 当任何表或行更新时,mssql 有什么方法可以通知我的 python 应用程序?
- javascript - JavaScript 正则表达式仅验证 URL 中的路径参数
- javascript - 如何使用 jQuery 或 CSS 设置提交按钮第一个单词的样式
- python - 在 Python 3.6 中从 URL 下载数据