【问题标题】:Using Knockoutjs And Server Side Validation in .NET MVC2在 .NET MVC2 中使用 Knockoutjs 和服务器端验证
【发布时间】:2012-02-23 14:09:30
【问题描述】:

我正在使用 MVC2。

在使用敲除时推荐的服务器端验证方式是什么?

目前,我的大部分表单都在部分视图中,其中有一个带有验证属性的 C# ViewModel。像这样的:

public class SomeThingViewModel
{
    [Required]
    public string Name { get; set; }

    [Required]
    public int Number{ get; set; }
}

所以当表单被提交到服务器时,我得到了所有的模型错误,我可以返回带有错误的表单,这些错误显示为:Html.ValidationMessageFor(m => m.Name)%>。然后将其重新加载到主页上保存表单的元素中,以便用户可以看到错误。这将杀死我假设的淘汰赛形式的任何绑定。

我不确定如何使用淘汰赛来解决这个问题。

【问题讨论】:

  • 很高兴听到您为项目选择的任何可能的解决方案,以了解如何在客户端使用 knockoutjs 处理服务器端验证检查。请在下面作为答案或评论分享。我太糊涂了!!

标签: c# validation asp.net-mvc-2 knockout.js


【解决方案1】:

这可能很棘手,但做对了就像轻而易举。

首先,同步您的视图模型。您在淘汰赛中拥有的客户端将完全传递给服务器。其次,不要做带有淘汰赛的服务器端 HTML。创建在服务器端设置的字段并在客户端读取指示 ViewModel 中每个数据字段的有效性。

因此,如果您的 Model 有一个字段 Name,那么您的 ViewModel 有 NameName_ValidationResult,这是一个枚举,指示 Name 字段是否有效以及为什么无效。如果您的服务器端验证失败,请设置您的验证结果字段并将整个服务器端 ViewModel 传递回客户端,以便在请求完成后重新设置为客户端 ViewModel。基本上,您重新创建了 ASP.NET 的 ViewState 部分,但这样做的格式可以与 Knockout.js 一起使用

在客户端,您的错误消息仅根据ValidationResult 字段的值显示。因此,您可能会收到一条预设错误消息,指出“必须设置名称字段”,仅当Name_ValidationResult 的值为“空”时才会显示(例如)。

基本上,您实际上使用 MVVM 模式并稍作调整,以解决必须往返服务器的问题。

所以您建议我在 C# ViewModel 中为每个属性添加 ValidationResult 字段。然后在我检查模型的有效性时在我的控制器中设置 ValidationResult 属性。然后将视图模型作为 JSON 传回?这样我就可以更新我的淘汰赛视图模型。这将需要我在某种程度上手动验证,对吗?或者我可以利用我最终会遇到的 ModelState 错误吗? – 空白龙

你所有的问题都是肯定的。

事实上,我错过了您使用 DataAnnotations 进行验证的事实,或者我会提到它。您应该能够利用 ModelState 错误来设置您传递回淘汰页面的验证结果。

问题在于,您正在使用两种根本不兼容的技术,并希望它们能够很好地结合使用,但我认为这不会如您所愿。必须付出一些代价,我建议最好的一点是服务器端。喝掉淘汰赛的清凉剂,然后在服务器端修复您必须做的事情。

【讨论】:

  • 所以您建议我在 C# ViewModel 中为每个属性添加 ValidationResult 字段。然后在我检查模型的有效性时在我的控制器中设置 ValidationResult 属性。然后将视图模型作为 JSON 传回?这样我就可以更新我的淘汰赛视图模型。这将需要我在某种程度上手动验证,对吗?或者我可以利用我最终会遇到的 ModelState 错误吗?
  • 我参加聚会可能有点晚了,但我有点困惑..你是说他/我们应该放弃服务器端验证而只通过淘汰赛进行验证吗?那不是很危险吗?还是我误会你了? ^^
  • @Pharao2k 否。验证应该始终发生在服务器端,即使您也验证客户端也是如此。我的建议是服务器端验证可以以淘汰友好的方式传回客户端。
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多