显示自定义消息以进行远程验证成功响应

时间:2011-06-21 09:18:45

标签: validation asp.net-mvc-3 remote-validation

我正在使用远程验证来检查我的asp.net mvc 3应用程序(C#)注册时的用户名是否可用。

我正在使用MVC远程属性验证:

[Remote("IsUserNameAvailable", "User")]
public string UserName { get; set; }

我需要在两个条件下显示消息:

  1. 显示错误消息“用户名不可用” - 失败条件
  2. 显示成功消息“用户名可用” - 成功条件
  3. 我可以在没有任何问题的情况下显示失败条件的消息,如:

    return Json("Username not available", JsonRequestBehavior.AllowGet);
    

    但是对于Success Condition,我需要发送true作为响应(不是使用自定义消息):

     return Json(true, JsonRequestBehavior.AllowGet);
    

    如何显示远程验证成功条件的自定义消息?

2 个答案:

答案 0 :(得分:2)

看到这个链接...... here

实现这一目标的一种方法是从验证操作中添加自定义HTTP响应标头:

public ActionResult IsUserNameAvailable(string username)
{
if (IsValid(username))
{
    // add the id that you want to communicate to the client
    // in case of validation success as a custom HTTP header
    Response.AddHeader("X-ID", "123");
    return Json(true, JsonRequestBehavior.AllowGet);
}

return Json("The username is invalid", JsonRequestBehavior.AllowGet);
}

现在在客户端上我们显然有一个标准表单和用户名的输入字段:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.UserName)
    @Html.ValidationMessageFor(x => x.UserName)
    <button type="submit">OK</button>
}

现在最后一个难题是将完整的处理程序附加到用户名字段的远程规则中:

$(function () {
$('#UserName').rules().remote.complete = function (xhr) {
    if (xhr.status == 200 && xhr.responseText === 'true') {
        // validation succeeded => we fetch the id that
        // was sent from the server
        var id = xhr.getResponseHeader('X-ID');

        // and of course we do something useful with this id
        alert(id);
    }
};
});

答案 1 :(得分:0)

您是否能够返回一个对象(将被序列化为Json)?

如:

var answer = new { success = true, message = "Username available" };
return Json(answer, JsonRequestBehavior.AllowGet);

然后你可以在视图中解析它。

此外,如果您这样做,但用户名不可用,您也可以添加一些建议的用户名。

e.g。

// pretend they chose "dave"
List<string> alternativeNames = new List<string>() { "dave1", "dave2" };
var answer = new { success = false, message = "Username not available", alternatives = alternativeNames };
return Json(answer, JsonRequestBehavior.AllowGet);