TransWikia.com

HOW? Controller return nothing/current view

Stack Overflow Asked by Dent Argue on November 24, 2021

SHORT:
How do I make a controller return the current view or just simply do nothing?

LONG:
I have a partial view where i’ve created an imageslider.
It contains a link which sends a request to a controller to get the next image (using ajax).
The controller fetches the next image, stores it in ViewData and sends back a partial view (the one above).

Now, what I do today is that when the controller reaches the last image it re-return the very same image (by refetching it), but still creates a new view, that is, the client/browser re-parses the “same” data.

This seems somewhat non-optimal.

What I’d like to do is that when controller reaches the last image it should simply do nothing.
If I return null then the view is updated with empty contents.
I want the view/client/browser to retain whatever it has and the controller to simply do nothing.

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

5 Answers

I would use

return new HttpStatusCodeResult(204);

this way you would stay on the same page and there is no post back. Here is the defination

The HTTP 204 No Content success status response code indicates that the request has succeeded, but that the client doesn't need to go away from its current page

Answered by Junior Cortenbach on November 24, 2021

I ran into this problem today. I wanted to find a solution for how to deal with double-clicks on the client side trying to reenter the controller action on the server side while it was still processing. If a user entered that action, I wanted it to just ignore the request and do nothing on the browser side.

Solution looks like this:

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

Returning a status code of 204 basically does nothing to the page displayed in the browser. The actual result eventually makes it back to the browser when the action is complete.

This question is old, but I wasn't able to find an answer anywhere on StackOverflow. I figured it had to be possible since a FileResult doesn't really affect the current page, either, other than saving a file.

Answered by Jim Berg on November 24, 2021

Ok, I've got it.
Not a solution to my question but still solves the problem.

I'll simply not show the "Next" link when the view shows the last image.

Can't believe I didn't think of it earlier...

Thanks for your efforts guys

Answered by Dent Argue on November 24, 2021

Assuming that you are using MicrosoftMvcAjax, you could send back a JavascriptResult that alerts the user that they have reached the end of the slider. If the response is javascript rather than content, the MicrosoftMvcAjax handler executes it instead of replacing the DOM contents.

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

Of course, you'd probably want to be more creative and use the jQuery dialog plugin or something rather than an alert.

Answered by tvanfosson on November 24, 2021

You can return an EmptyResult if you want it to do nothing...

return new EmptyResult();

If you're using the AjaxHelper you can avoid the update by supplying an unsuccessful status code (e.g. 404 or whatever is most appropriate), that'll stop it replacing your div as the javascript in MicrosoftMvcAjax.js explicitly checks for a successful response before updating any elements:-

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

Ultimately the best way to avoid it is to design the partial view so it avoids the problem in the first place (like you mention yourself).

Answered by John Foster on November 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP