asp.net-mvc - 远程验证似乎有问题

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

想象一下这种情况:

设置

在默认的 MVC3 项目中,在 AccountModels.cs 中创建一个新的复杂类型

public class GlobalAccount
{
    public GlobalAccount()
    {
        this.LogOn = new LogOnModel();
        this.Register = new RegisterModel();
    }

    public LogOnModel LogOn { get; set; }
    public RegisterModel Register { get; set; }
}

RegisterModel更改 UserName到:
[Required]
[Remote("UserNameExists", "Validation", "", ErrorMessage = "Username is already taken.")]
[RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed.")]
[Display(Name = "Username (spaces will be stripped, must be at least 6 characters long)")]
public string UserName { get; set; }
UserNameExists Validation 中的方法 Controller 如下:
public class ValidationController : Controller
{
    public JsonResult UserNameExists(string UserName)
    {
        string user = null;
        if (!String.IsNullOrWhiteSpace(UserName) && UserName.Length >= 6)
            user = UserName == "abcdef" ? "ok" : null;

        return user == null ?
            Json(true, JsonRequestBehavior.AllowGet) :
            Json(string.Format("{0} is not available.", UserName), JsonRequestBehavior.AllowGet);
    }
}

现在在注册 View 中,使用 GlobalAccount型号而不是 RegisterModel
用户名输入框将如下所示:
@model Your.NameSpace.Models.GlobalAccount


 <div class="field fade-label">
    @Html.LabelFor(model => model.Register.UserName, new { @class = "text" })
    @Html.TextBoxFor(model => model.Register.UserName, new { spellcheck = "false", size = "30" })
</div>

这将导致这样的事情,在 HTML
<div class="field fade-label">
    <label class="text" for="Register_UserName"><span>Username (spaces will be stripped, must be at least 6 characters long)</span></label>
    <input data-val="true" data-val-regex="White space is not allowed." data-val-regex-pattern="(\S)+" data-val-remote="Username is already taken." data-val-remote-additionalfields="*.UserName" data-val-remote-url="/beta/Validation/UserNameExists" data-val-required="The Username (spaces will be stripped, must be at least 6 characters long) field is required." id="Register_UserName" name="Register.UserName" size="30" spellcheck="false" type="text" value="">
</div>

调试

如果您使用 FireBug 来检查发生了什么......远程验证将属性名称而不是属性 id 发送到验证方法(UserNameExists 一个),如下所示:
Register.UserName而不是 Register_UserName
所以我无法获取这个值... 曾经 :(

这真的是一个错误还是某人已经发现而我无法通过谷歌搜索得到的东西?

这是实际问题的简单图像:

enter image description here

最佳答案

怎么样:

public ActionResult UserNameExists(
    [Bind(Include = "UserName")]RegisterModel register
)
{
    string user = null;
    if (!String.IsNullOrWhiteSpace(register.UserName) && register.UserName.Length >= 6)
        user = register.UserName == "abcdef" ? "ok" : null;

    return user == null ?
        Json(true, JsonRequestBehavior.AllowGet) :
        Json(string.Format("{0} is not available.", register.UserName), JsonRequestBehavior.AllowGet);
}

另一种可能性是定义一个特殊的 View 模型:
public class UserNameExistsViewModel
{
    public string UserName { get; set; }
}

进而:
public ActionResult UserNameExists(UserNameExistsViewModel register)
{
    string user = null;
    if (!String.IsNullOrWhiteSpace(register.UserName) && register.UserName.Length >= 6)
        user = register.UserName == "abcdef" ? "ok" : null;

    return user == null ?
        Json(true, JsonRequestBehavior.AllowGet) :
        Json(string.Format("{0} is not available.", register.UserName), JsonRequestBehavior.AllowGet);
}

令人讨厌的是以下不起作用:
public ActionResult UserNameExists(
    [Bind(Prefix = "Register")]string UserName
)

去图 :-) 我可能会使用自定义 View 模型。看起来最干净。

关于asp.net-mvc - 远程验证似乎有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5800862/

相关文章:

c# - 公开个人资料的可公开查看的 UserId

c# - MVC View 中的日期时间格式错误

asp.net-mvc - 如何为 MVC 4 Api 制作更多 MapHttpRoutes

c# - 使用来自 WCF WebService 的模型

c# - 保持配置文件 ID 可通过应用程序访问

java - 使用 xml 文件验证 struts 不起作用

asp.net-mvc - ASP.NET MVC Telerik 网格 : How to make one column read only on edit?

javascript - 在正则表达式字符括号中包括连字符?

php - 好的 PHP 验证库

c# - 如何动态更改mvc3中标签的可见性?