ASP.net MVC3 - Razor Views и PartialView с ретрансляцией 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/info/4655365/mvc3-submit-ajax-form
Но ничто не устранило эту проблему. Я изменил InsertionMode на все значения без изменений. Я изменил @Html.Partial на блок кода, например
@{
Html.RenderPartial( "_ ForgotPasswordUserNameAjax", ViewData.Model);
}.
Это не работает...
У меня заканчиваются идеи (и терпение)!
Пожалуйста, помогите!
Ответы
Ответ 1
ИЗМЕНИТЬ
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/
Ответ 2
Поскольку вы возвращаете только частичное представление, это все, что обрабатывается. Эта функция более строго соблюдается в 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;
}
Ответ 3
Я думаю, что "главное" представление также называется "Забытое", как частичные представления.
Поскольку контроллер возвращает только PartialViewResult, макет не используется.
Создайте другое действие для родительского представления и вызовов ajax.