什么是使用淘汰赛时建议的表单服务器端验证方式?
目前,我的大部分表单都是部分视图,其中包含带有验证属性的C#viewmodel.像这样的东西:
public class SomeThingviewmodel { [required] public string Name { get; set; } [required] public int Number{ get; set; } }
因此,当表单提交到服务器时,我得到所有模型错误,我可以返回带有错误的表单,其中显示如下:<%:Html.ValidationMessageFor(m => m.Name)%> ;.然后将其重新加载到保存主页面上的表单的元素中,以便用户可以看到错误.这会杀死我所假设的淘汰表格中的任何绑定.
我真的不确定如何使用淘汰赛来解决这个问题.
解决方法
首先,同步您的视图模型.在淘汰赛中你有客户端,你准确地传递给服务器.其次,不要使用knockout执行服务器端HTML.创建设置为服务器端并读取客户端的字段,以指示viewmodel中每个数据字段的有效性.
因此,如果您的模型具有字段名称,则viewmodel具有Name和Name_ValidationResult,这是一个枚举,指示Name字段是否有效以及为什么不是.如果服务器端验证失败,请设置验证结果字段并将整个服务器端viewmodel传递回客户端,以在请求完成后重新设置为客户端viewmodel.基本上,您重新创建ASP.NET的ViewState部分,但这样做的格式将与Knockout.js一起使用
在客户端,您有只显示基于ValidationResult字段值的错误消息.因此,您可能有一个罐装错误消息,指出“必须设置名称字段”,只有在Name_ValidationResult的值为“Empty”时才会显示(例如).
基本上,您实际上使用MVVM模式进行小调整以解释必须往返服务器的问题.
So you are suggesting that I add ValidationResult fields in my C# viewmodel for each property. Then set the ValidationResult Properties in my controller when I check for the Model’s validity. Then pass back the viewmodel as JSON? so that I can update my knockout viewmodel. This will require me to manually validate to some extent right? Or can I leverage the ModelState errors that I will end up with? – Blankasaurus
你的所有问题都是肯定的.
事实上,我错过了你使用DataAnnotations进行验证的事实,或者我已经提到了它.您应该能够利用ModelState错误来设置您传递回淘汰页面的验证结果.
问题是你使用了两种根本不兼容的技术,并希望它们能够很好地协同工作,而且我认为这不会像你希望的那样发挥作用.有些东西必须给予,我建议最好的一点是服务器端.喝淘汰冷却助剂,并修复你的服务器端.