Это, конечно, не вопрос новичка, и я причесался в Интернете, чтобы найти ответ на эту проблему, и до сих пор лучшее решение, которое я нашел, было спрятано в этом уроке здесь .Это то, что Дарин Димитров предлагал с обновлением Ajax.Я кратко опишу важные части этой ссылки и почему это не так легко исправить: /
Обновление Ajax на основе странного любовника
Решение с обновлением Ajaxв значительной степени зависит от следующей функции (странный любовник использует ControllerContext, но он для меня не существовал, поэтому у меня есть ControllerExtension):
ControllerExtension.RenderPartialViewToString(this,"mypartial", (object)model)
Эта функция - то, что берет вашу модель + состояние модели и возвращает ваш частичный вид вHTML-строка.Затем вы можете взять эту строку и отправить ее обратно в json-объект в некоторый javascript для обновления представления.Я использовал jquery, и это выглядит так:
$(document).ready(function () {
var partialViewUpdate = function (e) {
e.preventDefault(); //no postback
var partialDiv = $(this).parent(".partial");
$.post($(this).attr("action"),
$(this).serialize(),
function (json) {
if (json.StatusCode != 0) {
// invalid model, return partial
partialDiv.replaceWith(json.Content);
}
else if (json.Content != null && json.Content != "") {
window.location.replace(data.Content);
};
});
$(".partial").find("form")
.unbind('submit')
.live("submit", partialViewUpdate);
};
Объяснение Jquery:
- Найдите div, который содержит мою частичную (class = "partal "), и найдите форму вэтот div
- Отсоедините любые другие события "submit" с этой формой (у меня возникла странная ошибка двойного представления, пока я не сделал это unbind).
- используйте "live", чтобы после замены содержимогоон снова связывается
- Как только мы входим в функциюpartalViewUpdate ...
- Запретить завершению отправки формы, чтобы она могла быть обработана ajax.
- получить divкоторый содержит мою часть (буду использовать это позже)
- Установите URL-адрес поста jquery, взяв его из формы, $ (this) .attr ("action")
- Примите форму (т.е.наша модель) и сериализовать его для функции контроллера, $ (this) .serialize ()
- Создать функцию, которая будет обрабатывать возвращаемое значение ajax.
- Я использую свой собственный объект json,где StatusCode 1 плохо.Так что, если это плохо, тогда я беру то, что в Content, это строка, которую RenderPartialViewToString дал мне, и я просто заменяю содержимое div, которое содержит мой частичный.
Почему он не «просто работает» нормально
Так что причина, по которой партиалы не работают только с проверкой состояния модели, заключается в том, что вы не можете вернуть View (модель) с POST, потому чтоMVC разрешит это в адрес маршрута частичного представления (login.ascx) вместо того, где встроено частичное (index.aspx).
Вы также не можете использовать RedirectAction (), потому что это отправит егоto (index.aspx) функция контроллера, которая эквивалентна очистке всего и обновлению страницы index.aspx.Однако, если вы используете ActionFilter, предложенный Chino и Thabaza, тогда, когда ваша страница обновляется и функция контроллера login.ascx снова запускается, она получает эти временные данные.Это, однако, не работает, если обновление страницы вызывает хлопоты с кодом на стороне клиента, таким как всплывающие модалы (т.е. если вы обновляете, ваше всплывающее окно исчезло).
Скажите это не так
Я бы предпочел, чтобы это «просто сработало», поэтому, если кто-нибудь знает правильный / лучший способ сделать это, поделитесь им!Я до сих пор чувствую, что решения Ajax refresh и ActionFilter не являются чистым способом сделать это, потому что они почти создают впечатление, что частичные представления с формами невозможно использовать без какого-либо «трюка».