この状況を想像してください:
設定
デフォルトの 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の代わりに属性名を検証メソッド(1つ)に次のように送信しています。UserNameExists
Register.UserName
それ以外のRegister_UserName
だから私はこの値を取得することはできません...今まで:(
これは本当にバグなのか、それとも誰かがすでに発見したもので、Google で調べてもわからなかったのでしょうか?
実際の問題の簡単なイメージを次に示します。