私はこれが既に頼まれていると確信していますが、私はすべての解決策を試してきましたが、与えられた解決策のどれもが私の問題を解決していません。おそらく、私はそれを正しく実装していないでしょう。mvc3 - ajaxフォーム提出とサーバー側の検証
私はMVC3、razor、jQueryを使用しています。
私は新しいユーザー登録フォームを持っています。登録が成功すると、成功したメッセージ(登録のタイプとは異なる)をダイアログボックスに表示します。
ModelStateにエラーがある場合は、ModelState.IsValid == falseを意味し、ValidationSummaryにエラーを表示したいとします。
ビュー
function OnBegin() { alert('begin'); return $('form').validate().form(); }
function OnSuccess() { alert('success'); DisplaySucess()}
function OnFailure() { alert('failure'); }
function DisplaySuccess() {
var typeOfRegistration = $('input:radio[name=RegistrationType]:checked').val();
var msg;
if (typeOfRegistration == 0) {
msg = "You are successfully enrolled for Algebra classes.";
}
if (typeOfRegistration == 1) {
msg = "You are registered with your email address. Someone would contact you with an email.";
}
if (typeOfRegistration == 2) {
msg = "Thank you for filling up this form. One welcome packet would be delivered with in next 15 days";
}
msg = msg.replace(/\n/g, '<br />');
$('#dialog').html(msg);
$('#dialog').dialog('open');
}
@model Models.RegistrationModel
@using (Ajax.BeginForm("NewRegistration", "Account", new AjaxOptions() { OnBegin="OnBegin", OnSuccess = "OnSuccess", OnFailure = "OnFailure" }))
{
@Html.ValidationSummary()
<div>
Register<br />
@Html.RadioButton("RegistrationType ", "0", true) New Algebra class<br />
@Html.RadioButton("RegistrationType ", "1") New user registration by email<br />
@Html.RadioButton("RegistrationType ", "2") New user registration by mailing address<br/>
..some more types
</div>
<div>
…here I display/hide controls based on Registration type selected.
<div>
@Html.LabelFor("UserName")
@Html.TextBox("UserName")</div>
}
コントローラ
public ActionResult NewRegistration(RegistrationModel model)
{
if (Request.IsAjaxRequest())
{
if (!ModelState.IsValid) {
//Ques: How do I display this in ValidationSummary.
return Json(new object[] { false, "Contains Email Address", ModelState.GetAllErrors() });
}
else {
if (UserNameIsTaken){
//Ques: This does not show in ValidationSummary
ModelState.AddModelError("_FORM", "This username is already taken. Please pick a different username.");
}
}
}
else if (!ModelState.IsValid) { return View(model); }
}
モデル
public class RegistrationModel: IValidatableObject
{
[Required] //this gets displayed in ValidationSummary as Client-side validation
public string UserName { get; set; }
.. and all fields here
}
public IEnumerable<ValidationResult> Validate(ValidationContext context)
{
if (!string.IsNullOrEmpty(UserName) && UserName.Contains(EmailAddress)) {
yield return new ValidationResult("Username cannot contain email address", new[] { "UserName" });
}
}
Web.configファイルはあり
UnobtrusiveJavaScriptEnabled含ま
の.jsファイルは= "@ Url.Content("
スクリプトSRCある= "真" = "真" とClientValidationEnabled "〜/ Scripts/jquery-1.7.1.min.js") "type =" text/javascript ">
スクリプトsrc =" @ Url.Content( "〜/ Scripts/jquery.validate.min.js" ) "type =" text/javascript ">
スクリプトSRC = "@のUrl.Content(" 〜/スクリプト/ jquery.validate.unobtrusive.min.js ")" タイプ= "テキスト/ javascriptの">
スクリプトSRC = "@ Url.Content ( "〜/ Scripts/jquery.unobtrusive-ajax.min.js") "type =" text/javascript ">
私はここで何が欠けていますか?代わりに? ありがとうございます。
私はあなたが示唆したようにやってeneded試験や読書をたくさんした後。サーバー側のエラーがある場合、objectの最初のパラメーターとしてJsonをfalseで返します。 OnSucessでは、エラーチェックデータ[0] == false(エラーを意味する)を取得し、それをValidationSummaryマークアップに挿入します。ありがとう。 – peacefulmember