ASP.net MVC3 - Razor Views и PartialViews с обратной передачей Ajax - PullRequest
14 голосов
/ 03 февраля 2011

Мне очень не удалось заставить это работать!

В представлении ...

@model Project.Models.Account.ForgotPasswordModel

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

<h2>ForgotPassword</h2>

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

Я рендерим это частичное представление ...

@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 /3295606/mvc3-otpravit-formu-ajax

Но ничего не решило эту проблему.Я изменил InsertionMode для всех значений без изменений.Я изменил @ Html.Partial на блок кода, например @ {Html.RenderPartial ("_ ForgotPasswordUserNameAjax", ViewData.Model);}.

Это не работает ...

У меня заканчиваются идеи (и терпение)!

Пожалуйста, помогите!

Ответы [ 3 ]

8 голосов
/ 03 февраля 2011

EDIT 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/

1 голос
/ 04 февраля 2011

Поскольку вы возвращаете только частичное представление, это все, что обрабатывается. Эта функциональность более строго соблюдается в MVC3 из-за способа обработки представлений Razor.

Просто измените действие вашего контроллера на следующее:

[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;

        }
0 голосов
/ 03 февраля 2011

Я думаю, что "основной" вид также называется ForgotPassword, так же как и частичный вид.

Поскольку контроллер возвращает только PartialViewResult, макет не используется.

Создайте другое действие для родительского представления и вызовов ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...