【问题标题】:Web API MVC model validation without controller没有控制器的 Web API MVC 模型验证
【发布时间】:2017-10-09 14:43:44
【问题描述】:

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

除此之外,我还能够在进入 Controller 方法的实际实现之前加入一个检查 ModelState 的验证属性:

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

[HttpPost]
[ValidateModel]
public void SubmitMyModel([FromBody] SomeModel model)
{
   // Some code here
}

所有这些都按预期正确运行。

我遇到的问题是,因为一种控制器方法专门用于运行验证(“即时”方式),而另一种完全致力于实际提交表单,有无需在执行纯验证的 Controller 方法中运行代码。这最终导致方法的主体为空。这不是干净的代码设计,而是通过 Attributes 重新使用验证代码。我也很讨厌只运行包含提交代码的“仅验证”场景,因为这会模糊其目的。

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

【问题讨论】:

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

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


【解决方案1】:

在 MVC 中通过 HTTP 请求访问某些内容的唯一方法是通过控制器方法。

你说“这不是干净的代码”,但为什么呢?您有两种具有不同目的的方法,它们向客户端公开,但它们都共享相同的可重用代码来完成它们都需要的部分。我可以看到没有重复的业务或验证逻辑,也没有冗长或尴尬的解决方法。

恕我直言,它实际上工作得很好,我不会改变你的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2013-06-26
    • 2014-12-18
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多