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

C# 在.NET MVC2中使用Knockoutjs和服务器端验证,c#,validation,asp.net-mvc-2,knockout.js,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; } } 因此,当表单提交到服务器时,我会得到所有模型错误

我正在使用MVC2

使用淘汰时,建议采用什么样的服务器端表单验证方式?

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

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

    [Required]
    public int Number{ get; set; }
}
因此,当表单提交到服务器时,我会得到所有模型错误,并且我可以返回带有错误的表单,这些错误会显示为:m.Name)%>。然后将其重新加载到主页上保存表单的元素中,以便用户可以看到错误。这将消除我在knockout中对表单的所有绑定


我真的不知道如何使用击倒来实现这一点。

这可能会很棘手,但正确的做法很容易奏效

首先,同步viewmodels。客户端所做的工作将完全传递给服务器。第二,不要在服务器端HTML中使用knockout。创建在服务器端和读取客户端设置的字段,用于指示ViewModel中每个数据字段的有效性

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

在客户端,您会看到错误消息,这些消息仅基于
ValidationResult
字段的值显示。因此,您可能会收到一条隐藏的错误消息,其中说明“必须设置名称字段”,仅当
Name\u ValidationResult
的值为“空”(例如)时才会显示该消息

基本上,您实际上使用了MVVM模式,并对往返服务器进行了一些小的调整


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

底线是你所有的问题都是肯定的

事实上,我忽略了您使用数据注释进行验证的事实,否则我会提到这一点。您应该能够利用ModelState错误设置验证结果,并将其传递回淘汰页面


问题是你正在使用两种根本不兼容的技术,希望它们能配合得很好,我不认为这会像你希望的那样。有些东西必须给出,我建议最好的一点是服务器端。喝下“击倒”凉水辅助液,然后在服务器端修复您所需的内容

因此,您建议我在C#ViewModel中为每个属性添加ValidationResult字段。然后在检查模型的有效性时,在控制器中设置ValidationResult属性。然后将viewmodel作为JSON传回?这样我就可以更新我的淘汰视图模型。这需要我在某种程度上手动验证,对吗?或者我可以利用最终会出现的ModelState错误吗?我可能会迟到一点,但我有点困惑。。你是说他/我们应该抛弃服务器端验证,而只是通过敲除进行验证?那不是很危险吗?还是我误解了你^^@Pharao2k否。验证应该始终在服务器端进行,即使您也在客户端进行验证。我的建议是,服务器端验证可以以一种击出友好的方式传回客户端。如果您能听到您为项目选择的任何可能的解决方案,以及如何在客户端使用击出JS处理服务器端验证检查,那将是非常棒的。请分享以下答案或评论。我太糊涂了!!