КАК? Контроллер ничего не возвращает / текущий вид - PullRequest
24 голосов
/ 24 февраля 2009

SHORT:
Как заставить контроллер возвращать текущее представление или просто ничего не делать?

LONG:
У меня есть частичное представление, где я создал imageslider. Он содержит ссылку, которая отправляет запрос контроллеру для получения следующего изображения (используя ajax). Контроллер выбирает следующее изображение, сохраняет его в ViewData и отправляет обратно частичное представление (изображение выше).

Теперь, что я делаю сегодня, так это то, что когда контроллер достигает последнего изображения, он повторно возвращает то же самое изображение (путем его повторного получения), но все еще создает новое представление, то есть клиент / браузер повторно анализирует «то же самое» данные.
Это кажется неоптимальным.

Я хотел бы, чтобы, когда контроллер достиг последнего изображения, он просто ничего не делал.
Если я возвращаю ноль, то представление обновляется с пустым содержимым.
Я хочу, чтобы представление / клиент / браузер сохраняли все, что у него было, а контроллер просто ничего не делал.

    [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");
    }

Ответы [ 4 ]

27 голосов
/ 24 февраля 2009

Вы можете вернуть EmptyResult, если хотите, чтобы он ничего не делал ...

return new EmptyResult();

Если вы используете AjaxHelper, вы можете избежать обновления, указав неудачный код состояния (например, 404 или любой другой, наиболее подходящий), что остановит его, заменив ваш div в качестве javascript в MicrosoftMvcAjax.js, явно проверяющего наличие успешный ответ перед обновлением любых элементов: -

this.ControllerContext.HttpContext.Response.StatusCode = 404;
return new EmptyResult();

В конечном счете, лучший способ избежать этого - это создать частичное представление, чтобы в первую очередь избежать проблемы (как вы упоминаете сами).

1 голос
/ 16 августа 2018

Я столкнулся с этой проблемой сегодня. Я хотел найти решение о том, как бороться с двойными щелчками на стороне клиента, пытаясь повторно ввести действие контроллера на стороне сервера, пока он еще обрабатывается. Если пользователь вводил это действие, я хотел, чтобы он просто игнорировал запрос и ничего не делал на стороне браузера.

Решение выглядит так:

public async Task<ActionResult> MyAction()
{
    if(!CanEnterAction(nameof(MyAction))) return new HttpStatusCodeResult(204);
    try
    {
         // Do long running stuff
         return ValidActionResult();
    }
    finally
    {
        ExitedAction(nameof(MyAction));
    }
}

Возвращение кода состояния 204 практически ничего не делает для страницы, отображаемой в браузере. Фактический результат в конечном итоге возвращается в браузер после завершения действия.

Этот вопрос старый, но я нигде не смог найти ответ в StackOverflow. Я подумал, что это должно быть возможно, так как FileResult на самом деле также не влияет на текущую страницу, кроме сохранения файла.

0 голосов
/ 24 февраля 2009

Хорошо, я понял.
Не решение моего вопроса, но все же решает проблему.

Я просто не буду показывать ссылку «Далее», когда вид показывает последнее изображение.

Не могу поверить, я не думал об этом раньше ...

Спасибо за ваши усилия, ребята

0 голосов
/ 24 февраля 2009

Предполагая, что вы используете 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 или что-то еще, а не предупреждение.

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