我正在使用MVC2。
使用淘汰赛时建议的表单服务器端验证方法是什么?
目前,我的大部分表单都是部分视图,其中包含带有验证属性的C#ViewModel。像这样:
public class SomeThingViewModel
{
[Required]
public string Name { get; set; }
[Required]
public int Number{ get; set; }
}
因此,当表单提交到服务器时,我得到了所有模型错误,我可以返回带有错误的表单,这些错误显示为:<%:Html.ValidationMessageFor(m => m.Name)%>
。然后将其重新加载到保存主页面上的表单的元素中,以便用户可以看到错误。这会杀死我在淘汰时对表格的任何绑定。
我不确定如何使用淘汰赛来解决这个问题。
答案 0 :(得分:4)
这可能很棘手,但是做得恰到好处就像一件轻而易举的事。
首先,同步您的视图模型。在淘汰赛中你有客户端,你准确地传递给服务器。其次,不执行带有淘汰的服务器端HTML 。创建设置为服务器端且读取客户端的字段,以指示ViewModel中每个数据字段的有效性。
因此,如果您的模型具有字段Name
,则您的ViewModel具有Name
和Name_ValidationResult
,这是一个枚举,用于指示“名称”字段是否有效以及为什么不存在。如果服务器端验证失败,请设置验证结果字段并将整个服务器端ViewModel传递回客户端,以便在请求完成后重新设置为客户端ViewModel。基本上,您重新创建ASP.NET的ViewState部分,但是这样做的格式将与Knockout.js一起使用
在客户端,您的错误消息仅根据ValidationResult
字段的值显示。因此,您可能有一个预设错误消息,指出“必须设置名称字段”,仅当Name_ValidationResult
的值为“空”时才显示(例如)。
基本上,您实际上使用MVVM模式进行小调整以解释必须往返服务器的问题。
因此,您建议我在C#ViewModel中为每个属性添加ValidationResult字段。然后在检查模型的有效性时在我的控制器中设置ValidationResult属性。然后将viewmodel作为JSON传回去?这样我就可以更新我的淘汰视图模型。这需要我在某种程度上手动验证对吗?或者我可以利用我最终会遇到的ModelState错误? - Blankasaurus
你的所有问题都是肯定的。
事实上,我错过了您使用DataAnnotations进行验证的事实,或者我已经提到过它。您应该能够利用ModelState错误来设置传递回淘汰页面的验证结果。
问题在于你使用了两种根本不兼容的技术,并希望它们能够很好地协同工作,而且我认为这不会像你希望的那样发挥作用。有些东西必须给予,我建议最好的一点是服务器端。喝淘汰冷却助剂并修复你的服务器端。