在.NET MVC2中使用Knockoutjs和服务器端验证

时间:2012-01-31 20:41:15

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

我正在使用MVC2。

使用淘汰赛时建议的表单服务器端验证方法是什么?

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

这可能很棘手,但是做得恰到好处就像一件轻而易举的事。

首先,同步您的视图模型。在淘汰赛中你有客户端,你准确地传递给服务器。其次,不执行带有淘汰的服务器端HTML 。创建设置为服务器端且读取客户端的字段,以指示ViewModel中每个数据字段的有效性。

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

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

基本上,您实际上使用MVVM模式进行小调整以解释必须往返服务器的问题。

  

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

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

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

问题在于你使用了两种根本不兼容的技术,并希望它们能够很好地协同工作,而且我认为这不会像你希望的那样发挥作用。有些东西必须给予,我建议最好的一点是服务器端。喝淘汰冷却助剂并修复你的服务器端。