给定特定的QueryString值的.Net核心绑定到特定的模型

时间:2019-02-11 12:32:53

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

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

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

某些匹配具有相同的形状。唯一使它们与众不同的是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]属性修饰符,但是我担心的是,对于形状完全相同的匹配,我可能无法分辨是startAction还是{例如endAction

1 个答案:

答案 0 :(得分:0)

您将需要某种验证引擎,但不要将其与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个参数的变化,例如,当类型为“ something”时,数量只能小于200,so_rep只能做“随便什么”。使用FluentValidation库可以很好地完成此操作。