想象一下这种情况:
在默认的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
所以我无法获取此值... 永远 :(
这真的是一个错误,或者是某人已经找到的东西,我无法通过谷歌搜索获得它?
以下是实际问题的简单图片:
答案 0 :(得分: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
)
去图:-)我可能会选择自定义视图模型。它看起来最干净。
答案 1 :(得分:2)
我知道这标记为已回答,但由于我遇到同样的问题,我认为我会提供另一种适合我的变体。
我的案例中的类是“食物”,我试图远程验证的字段是“名称”。文本框由EditorFor控件创建:
@Html.EditorFor(model => model.Name)
远程验证在Food class字段中设置:
[Remote("FoodNameExists")]
public string Name { get; set; }
这称为方法:
public ActionResult FoodNameExists(string Name) {
根据原始问题,而不是将此作为“名称”传递给FoodNameExists方法,或者甚至是“Food_Name”,这是由EditorFor帮助程序创建的Id值,它将作为name属性传递, “Food.Name”......当然,这不是我可以设置为输入参数的东西。
所以,我的hack只是忽略输入参数并查看QueryString:
var name = Request.QueryString["Food.Name"];
...这会返回正确的值,我会对此进行验证,并且我将参加比赛。
答案 2 :(得分: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" } })
我希望它可能有所帮助。最诚挚的问候!