【问题标题】:ASP.NET Core Model Binding to force the prefix on complex typesASP.NET Core 模型绑定强制复杂类型的前缀
【发布时间】:2020-03-06 13:05:17
【问题描述】:

给定一个模型:

public class MyModel
{
    public MyModel()
    {
    }

    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

还有一个控制器动作:

public async Task<IActionResult> MyAction(MyModel myModel) {}

如何实现模型绑定行为以使 this 正确绑定:

www.host.blah/page?MyModel.Prop1=a&MyModel.Prop2=b

而且 this 不绑定(没有前缀):

www.host.blah/page?Prop1=a&Prop2=b

我不确定正确的术语,但从Model Binding in ASP.NET Core判断:

对于复杂类型的每个属性,模型绑定都会通过 名称模式 prefix.property_name 的来源。如果什么都没有 找到后,它只查找不带前缀的 property_name。

但我想避免没有前缀的默认回退。

如果它完全相关,我正在尝试实现这一点,因为有问题的控制器可以嵌入到其他控制器/页面中,作为 UI 中的子选项卡,所以我无法控制哪些其他查询字符串参数将在那个时候存在。

【问题讨论】:

  • 为什么不使用 POST 并避免查询字符串?
  • @MladenB。你为什么关心那种类型的幂等性?为什么要在资源模型中公开消息细节?如果您决定重命名该类型,是否也应该破坏 HTTP API?
  • can be embedded in other controllers/pages, 这不是控制器的工作方式。控制器不仅仅是类或模块,它们指定 API。它们也不是页面,views 是页面。
  • @PanagiotisKanavos,我很欣赏这种关注,但感觉谈话与问题有所不同,这使得其他人很难集中注意力。我会尝试回答,但请尽量专注于最初的问题,因为那是我需要帮助的地方。重命名不是问题,因为这可以通过简单地使用nameof 来解决。代码已经这样写了,我没有时间重构整个应用程序,只是为了能够解决绑定问题......

标签: c# asp.net asp.net-core model-binding


【解决方案1】:

尝试使用OnPageHandlerSelected 方法来操作在选择模型之前执行的查询字符串。您可以在全球范围内注册并在整个应用程序中使用它。

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Http.Extensions;

public override void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
    //...
    var querystring = QueryHelpers.ParseQuery(context.HttpContext.Request.QueryString.Value);
    var items = querystring.SelectMany(x => x.Value, (col, value) => new KeyValuePair<string, string>(col.Key, value)).ToList();
}

或者,您可以创建自己的模型绑定器

进一步阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2018-08-30
    相关资源
    最近更新 更多