【问题标题】:.Net Core Binding to a Specific Model given a Specific QueryString Value.Net Core 绑定到给定特定 QueryString 值的特定模型
【发布时间】:2019-02-11 12:32:53
【问题描述】:

我正在重构一个分析 API,它需要允许客户端将事件作为 HTTP GET 请求发送,其“命中”数据编码在 URL 的 QueryString 参数中。

我的 API 的工作是接收这些事件,然后将 "valid" 事件放入系统另一部分的队列中进行处理。

一些 Hits 具有相同的形状。唯一使它们不同的是type 参数的值,所有事件都必须至少具有该值。

我遇到的问题是基于Hit类型,我希望能够假设给我的每个字段的类型,这需要模型绑定。当然。目前,我只能在检查 type 的值后才能找出要验证的模型 - 这可能会使 API 过度使用 "stringly typed"

一个示例路线是:

获取https://my.anonymousanalytics.net/capture?type=startAction&amount=300&so_rep=true

因此,我的命中是:

{
  type: "startAction",
  amount: 300,
  so_rep: true
}

假设可以绑定到模型StackOverflowStartHitModel

class StackOverflowStartHitModel {
  public string type { get; }  // Q: Could I force the value of this to be "startAction"?
?  public int amount { get; }
  public boolean so_rep { get; }
}

我为什么要在这里问这个?好吧,我通常是一名 JavaScript 开发人员,但我通常会求助于 C# 智慧的每个人都因流感而下班了。

我已经尝试过 [FromQuery] 属性装饰器,但我担心的是对于形状完全相同的 Hits,我可能无法区分它是 startAction 还是 endAction ,例如。

【问题讨论】:

  • 你还有哪些型号?
  • 我真的只是举个例子。目前我们有 11 个独特的模型,我们的一些事件成对工作,具有匹配的开始和结束事件。它们的形状完全相同,但类型值不同。
  • 是否有控制器或其他东西可以“获取”数据并对其进行处理?
  • 是的,有一个控制器

标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-core


【解决方案1】:

您将需要某种验证引擎,但不要将其与您的 UI 模型验证混淆。听起来您确实有一个模型具有许多有效状态,这确实是业务逻辑。

您的模型如下所示:

public class StackOverflowModel 
{
  public string type { get; set;}
  public int amount { get; set; }
  public bool so_rep { get; set;}
}

您的 type 字段具有什么值并不重要,您也不需要对其进行硬编码,它将按原样捕获,然后可以根据有效状态检查它。

有很多方法可以做到这一点,我能想到。

一种选择是创建一个有效规则列表(状态),然后简单地检查您的输入模型是否与其中任何一个匹配。实现此类功能的一种方法是使用 FluentValidation 之类的库。你可以在这里看到一个例子:Validation Rules and Business Rules in MVC

另一种选择是使用某种模式匹配技术,如下所述:https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching

无论您使用哪种选项,请确保将这些验证内容放在单独的类中,甚至可以放在单独的项目中。然后,您可以为必须确保一切正常的每个规则添加测试。这也将使您的控制器保持点亮。

您没有给出有效和无效状态的示例,但我猜您实际上是在谈论这 3 个参数的变体,例如,当 type 是“某物”时,数量只能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多