C# 无控制器的Web API MVC模型验证

C# 无控制器的Web API MVC模型验证,c#,asp.net-mvc,validation,asp.net-web-api,C#,Asp.net Mvc,Validation,Asp.net Web Api,我们正忙于编写一个应用程序,它利用了即时验证(onBlur、onClick等)和表单提交验证。“动态”检查和表单提交重新使用相同的代码来验证用户的输入。这是通过MVC的IValidatableObject接口完成的,该接口要求您覆盖Validate方法来存放验证代码 除此之外,我还能够合并一个Validation属性,该属性在进入控制器方法的实际实现之前检查ModelState: [HttpPost] [ValidateModel] public void ValidateMyModel([Fr

我们正忙于编写一个应用程序,它利用了即时验证(onBlur、onClick等)和表单提交验证。“动态”检查和表单提交重新使用相同的代码来验证用户的输入。这是通过MVC的
IValidatableObject
接口完成的,该接口要求您覆盖
Validate
方法来存放验证代码

除此之外,我还能够合并一个Validation属性,该属性在进入控制器方法的实际实现之前检查ModelState:

[HttpPost]
[ValidateModel]
public void ValidateMyModel([FromBody] SomeModel model)
{
}

[HttpPost]
[ValidateModel]
public void SubmitMyModel([FromBody] SomeModel model)
{
   // Some code here
}
所有这些都正常运行,并符合预期

我遇到的问题是,由于一个控制器方法专门用于运行验证(“动态”方式),另一个完全用于实际提交表单,因此不需要在执行纯验证的控制器方法内部运行代码。这最终导致方法体为空。这不是干净的代码设计,但通过属性重新使用验证代码是错误的。我也很讨厌只运行包含提交代码的“仅验证”场景,因为这模糊了它的用途


因此,我的问题是,在MVC中是否有一种方法可以在不必声明控制器方法的情况下对模型运行验证,同时仍然可以通过异步HTTP请求进行访问?

在MVC中,通过HTTP请求进行访问的唯一方法是通过控制器方法

你说“这不是干净的代码”,但为什么?您有两个不同用途的方法公开给客户机,但它们都共享相同的可重用代码来完成它们都需要的部分。我看不到业务或验证逻辑的重复,也没有冗长或笨拙的变通方法


我想它实际上运行得很好,我不会改变您的方法。

在真正提交之前,希望以这种方式验证模型服务器端的设计原因是什么?如果您想进行初始验证,只需在客户端进行验证并保存往返过程。你不能依赖客户端不改变初始服务器端和实际POST之间的数据,因此你需要在服务器上验证它,以便“真正”提交。通常我同意你的看法,但对于这个特定的项目,有相当多的IP需要隐藏在服务器后面,所以客户端验证是不可能的。显然,有些位是“必需”等,但其他很少。此“动态”验证是根据用户期望完成的!足够!我能想到的删除空操作的唯一其他方法是在模型上放置另一个属性(例如
bool JustValidate
),您可以在实际提交的早期检查并返回该属性,但这实际上只是将您的锅炉板代码转移到其他地方,并污染您的模型。我很想知道是否还有其他替代方案……正如James Thorpe建议的那样,如果需要验证或提交操作,可以使用布尔标志扩展模型。根据数据的提交方式,还可以检查ViewContext。不确定这是否有效,但要删除方法中的条件,可以创建自定义属性。在MVC中,通过HTTP请求访问某些内容的唯一方法是通过控制器方法。你说“这不是干净的代码”,但为什么?您有两个不同用途的方法公开给客户机,但它们都共享相同的可重用代码来完成它们都需要的部分。我看不到业务或验证逻辑的重复,也没有冗长或笨拙的变通方法。依我看,它实际上运行得很好。