3

想象一下这种情况:

设置

在默认的 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如下:

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);
    }
}

现在在注册视图中,使用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

所以我无法获取这个值......永远:(

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

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

在此处输入图像描述

4

3 回答 3

9

怎么样:

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);
}

另一种可能性是定义一个特殊的视图模型:

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
)

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

于 2011-04-27T07:47:56.123 回答
2

我知道这被标记为已回答,但由于我遇到了同样的问题,我想我会贡献另一个对我有用的变体。

在我的案例中,该类是“食物”,而我尝试远程验证的字段是“名称”。文本框由 EditorFor 控件创建:

@Html.EditorFor(model => model.Name)

在 Food 类字段上设置远程验证:

[Remote("FoodNameExists")]
public string Name { get; set; }

这调用了一个方法:

public ActionResult FoodNameExists(string Name) {

根据原始问题,它不是作为“名称”传递给 FoodNameExists 方法,甚至不是作为由 EditorFor 助手创建的 Id 值“食物名称”,而是作为名称属性传递,即“食物。名称”......这当然不是我可以设置为输入参数的东西。

所以,我的 hack 只是忽略输入参数并查看 QueryString:

var name = Request.QueryString["Food.Name"];

...这将返回正确的值,我对此进行了验证,然后我将参加比赛。

于 2011-05-15T23:55:35.773 回答
0

这是我发现的最简单的方法,只需在视图内的 DropDownListFor 的 HtmlAttributes 中添加 data-val- -属性。以下方法也适用于 RemoteValidation,如果您不需要远程验证,只需删除包含 data-val-remote-* 的元素:

        @Html.DropDownListFor(m => m.yourlistID, (IEnumerable<SelectListItem>)ViewBag.YourListID, String.Empty, 
        new Dictionary<string, object>() { { "data-val", "true" }, 
        { "data-val-remote-url", "/Validation/yourremoteval" }, 
        { "data-val-remote-type", "POST" }, { "data-val-remote-additionalfield", "youradditionalfieldtovalidate" } })

我希望它会有所帮助。最好的祝福!

于 2012-02-17T10:49:59.567 回答