КАК? Контроллер не возвращает ничего/текущий вид
SHORT:
Как заставить контроллер возвращать текущее представление или просто ничего не делать?
LONG:
У меня есть частичный вид, где я создал imagelider.
Он содержит ссылку, которая отправляет запрос контроллеру для получения следующего изображения (с использованием ajax).
Контроллер извлекает следующее изображение, сохраняет его в ViewData и отправляет обратно частичный вид (тот, что выше).
Теперь, что я делаю сегодня, так это то, что когда контроллер достигает последнего изображения, он повторно возвращает одно и то же изображение (путем его повторной установки), но все же создает новое представление, то есть клиент/браузер повторно анализирует "тот же самый", данные.
Это кажется несколько неоптимальным.
То, что я хотел бы сделать, это то, что когда контроллер достигает последнего изображения, он просто ничего не должен делать.
Если я возвращаю значение null, представление обновляется с пустым содержимым.
Я хочу, чтобы view/client/browser сохранял все, что у него есть, и контроллер просто ничего не делал.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetNextImage(...)
{
if(Request.IsAjaxRequest())
{
if(CURRENT_IMAGE != LAST_IMAGE)
{
Image image = GetNextImage(...);
var partialViewResult = new PartialViewResult();
partialViewResult.ViewName = "ImageSlide";
partialViewResult.ViewData.Model = image;
return partialViewResult;
}
else
{
// DO NOTHING, HOW?
}
}
return RedirectToAction("Error", "Home");
}
Ответы
Ответ 1
Вы можете вернуть EmptyResult, если хотите, чтобы он ничего не делал...
return new EmptyResult();
Если вы используете AjaxHelper, вы можете избежать обновления, предоставив неудачный код состояния (например, 404 или что самое подходящее), что остановит его замену вашего div, поскольку javascript в MicrosoftMvcAjax.js явно проверяет наличие успешный ответ перед обновлением любых элементов: -
this.ControllerContext.HttpContext.Response.StatusCode = 404;
return new EmptyResult();
В конечном счете, лучший способ избежать этого - создать частичный вид, чтобы избежать проблемы в первую очередь (например, вы упоминаете о себе).
Ответ 2
Предполагая, что вы используете MicrosoftMvcAjax, вы можете отправить обратно JavascriptResult, который предупреждает пользователя о том, что они достигли конца слайдера. Если ответом является javascript, а не контент, обработчик MicrosoftMvcAjax выполняет его вместо замены содержимого DOM.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetNextImage(...)
{
if(Request.IsAjaxRequest())
{
if(CURRENT_IMAGE != LAST_IMAGE)
{
Image image = GetNextImage(...);
var partialViewResult = new PartialViewResult();
partialViewResult.ViewName = "ImageSlide";
partialViewResult.ViewData.Model = image;
return partialViewResult;
}
else
{
return JavaScript( "alert('No more images');" );
}
}
return RedirectToAction("Error", "Home");
}
Конечно, вы, вероятно, захотите быть более креативными и использовать плагин диалога jQuery или что-то, а не предупреждение.
Ответ 3
Хорошо, у меня это есть.
Не решение моего вопроса, но решение этой проблемы все еще решается.
Я просто не покажу ссылку "Далее", когда на экране отображается последнее изображение.
Не могу поверить, что я не думал об этом раньше...
Спасибо за ваши усилия ребятам