web-dev-qa-db-ja.com

ASP.netMVC3-Ajaxポストバックを使用したレイザービューと部分ビュー

私はこれを機能させることに非常に失敗しました!

ビューで...

@model Project.Models.Account.ForgotPasswordModel

@{
    ViewBag.Title = "Forgot Password";
}

<h2>ForgotPassword</h2>

<span id='@ViewBag.ReplaceID'>
    @Html.Partial("_ForgotPasswordUserNameAjax", ViewData.Model)
</span>

このpartialViewをレンダリングします...

@model Project.Models.Account.ForgotPasswordModel

@{
    this.Layout = null;
}

@using (Ajax.BeginForm("ForgotPassword", new AjaxOptions() { UpdateTargetId = ViewBag.ReplaceID, InsertionMode = InsertionMode.InsertAfter }))
{
    @Html.ValidationSummary(true, "Forgot Password was unsuccessful. Please correct the errors and try again.")
    <div id="login" class="box">
            <fieldset>
            <h2>Account Information</h2>
            <div class="inside">
                <div class="editor-label">
                    @Html.LabelFor(m => m.Username)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(m => m.Username)
                    <br />
                    @Html.ValidationMessageFor(m => m.Username)
                    <br />
                </div>

                <p>
                    <input type="submit" value='Submit' />
                </p>
            </div>
        </fieldset>
    </div>   
}

そして、このコントローラーアクション...

[HttpPost]
        public PartialViewResult ForgotPassword(ForgotPasswordModel model)
        {

            if (String.IsNullOrEmpty(model.Username))
            {
                ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_REQUIRED);
            }
            else
            {
                bool isGood = false;
                model.Question = this._security.ValidateUserNameGetSecurityQuestion(model.Username, out isGood);

                if (!isGood)
                {
                    ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_INVALID);
                }

            }
            PartialViewResult retVal = null;
            if (ModelState.IsValid)
            {

                retVal = PartialView("ForgotPasswordAnswerAjax", model);
            }
            else
            {
                retVal = PartialView("_ForgotPasswordUserNameAjax", model);
            }

            return retVal;

        }

それでも、毎回、ビューはPartialViewのみを返し、レイアウトには含まれていません(したがって、PartialViewだけが画面に表示されます。他には何もありません)。オンラインで見つけたいくつかのことを試しました...- http://www.compiledthoughts.com/2011/01/aspnet-mvc-razor-partial-views-with.html http://stackoverflow.com/questions/4655365/mvc3-submit-ajax-形

しかし、この問題を修正したものはありません。 InsertionModeを変更せずにすべての値に変更しました。 @ Html.Partialを@ {Html.RenderPartial( "_ ForgotPasswordUserNameAjax"、ViewData.Model);のようなコードブロックに変更しました。 }。

それはうまくいきません...

私はアイデア(そして忍耐)が不足しています!

助けてください!

14
DavidAndroidDev

[〜#〜]編集[〜#〜]PEBKAC。

プロジェクトをアップグレードしたときに忘れてしまいました。新しいjquery.unobtrusive-ajax.jsファイルを追加しましたが、_Layout.cshtmlページに含めたことはありません。そのライブラリを追加して問題を修正しました。すみません!

元の投稿これはバグだと思い始めました。変換されていないプロジェクト(MVC2)を再度取得し、MVC3に変換します。元のページをすべてaspx/ascx形式のままにして、プロジェクトを実行しました。そのページを試してみました。同じ問題が引き続き発生します。 MVC2に戻ると、正常に動作します。 MVC3をもう一度試しましたが、問題が再発します。

これに非常によく似たページを使用してプロジェクトを変換しました...

http://mattsieker.com/index.php/2010/11/21/converting-asp-net-mvc2-project-to-mvc3/

8
DavidAndroidDev

部分的なビューのみを返すため、処理されるのはそれだけです。この機能は、Razorビューの処理方法により、MVC3でより厳密に守られています。

コントローラのアクションを次のように変更するだけです。

[HttpPost]
        public ActionResult ForgotPassword(ForgotPasswordModel model)
        {

            if (String.IsNullOrEmpty(model.Username))
            {
                ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_REQUIRED);
            }
            else
            {
                bool isGood = false;
                model.Question = this._security.ValidateUserNameGetSecurityQuestion(model.Username, out isGood);

                if (!isGood)
                {
                    ModelState.AddModelError("Username", ForgotPasswordStrings.USER_NAME_INVALID);
                }

            }
            PartialViewResult retVal = null;
            if (ModelState.IsValid)
            {

                retVal = View("ForgotPasswordAnswerAjax", model);
            }
            else
            {
                retVal = PartialView("_ForgotPasswordUserNameAjax", model);
            }

            return retVal;

        }
1
Clicktricity

「メイン」ビューは、部分ビューと同じようにForgotPasswordとも呼ばれると思います。

コントローラはPartialViewResultのみを返すため、レイアウトは使用されません。

親ビューとajax呼び出しに対して異なるアクションを作成します。

0
GvS