我有一个webform应用程序。
在客户端,我使用自定义JavaScript验证来高亮显示文本框,并在更改文本或单击提交按钮时显示验证消息。
服务器端验证在提交时进行。它会返回一个消息列表(字符串),以防止系统保存表单。
客户端验证是通用的,例如检查“必填字段”,“字数限制”,而服务器验证需要使用数据记录,例如“现有名称”,“当表B中有相关记录时,用户必须指定选项'A'。”
服务器端验证的缺点是它只返回消息摘要,但无法在文本框旁边显示消息。 (服务器端如何知道每个控件ID或在哪里显示每个消息?)
服务器端和客户端验证如何协同工作以在每个文本框上显示消息? .net的任何漂亮的设计或架构? 当然,所有客户端验证都将在服务器端以任何方式复制。
THX
答案 0 :(得分:2)
IMO ASP.NET验证器非常好,您可以使用Page.IsValid
检查服务器端的验证器。
如果您不检查每个控件和显示消息框的服务器值,那么您可以使用CustomValidator
并使用ajax调用某个服务器端方法并将其用于验证。
以下是CustomValidator
调用服务器端ashx处理程序以检查邮件地址是否有效的JavaScript函数示例,这只是一个示例,您可以使用ASP.NET提供的其他方法来调用服务器端(服务) ,页面方法等。)
只是注意:这不是服务器端验证的替换,您仍然需要这样做,因为这可以很容易地避免。
function IsEmailValid(val, args) {
var strUrl = "/SiteHandler.ashx?CheckEmail=" + args.Value;
var strReturn = "";
$.ajax({
url: strUrl,
success: function (html) { strReturn = html; },
async: false
});
args.IsValid = strReturn == "true";
}
将该功能设置为自定义验证器:
customValidator.ClientValidationFunction = "IsEmailValid";
在ashx处理程序的服务器端:
public void ProcessRequest(HttpContext context)
{
if (context.Request.Params["CheckEmail"] != null)
{
if (CallSomeCustomLogicAndReturnIsMailOK(context.Request.Params[CheckEmail]))
context.Response.Write("true");
else
context.Response.Write("false");
}
}
答案 1 :(得分:1)
一个好的解决方案是使用AJAX提交表单。您可以使用许多可用库中的一个,或者扩展您的自定义JavaScript解决方案来实现它。如果服务器验证失败,您可以连接以显示与客户端验证相同的消息。你说在两种情况下消息应该是相同的是正确的。用户不关心验证在服务器端或客户端是否失败。