怎么办?控制器不返回任何内容/当前视图

问题描述 投票:0回答:5

简短:
如何让控制器返回当前视图或只是不执行任何操作?

长:
我有一个创建图像滑块的部分视图。 它包含一个链接,该链接向控制器发送请求以获取下一个图像(使用 ajax)。 控制器获取下一张图像,将其存储在 ViewData 中并发送回部分视图(上面的视图)。

现在,我今天所做的是,当控制器到达最后一个图像时,它重新返回完全相同的图像(通过重新获取它),但仍然创建一个新视图,即客户端/浏览器重新解析“相同”数据。
这似乎有点不太理想。

我想做的是,当控制器到达最后一个图像时,它应该什么也不做。
如果我返回 null,则视图将更新为空内容。
我希望视图/客户端/浏览器保留它所拥有的一切,而控制器什么也不做。

    [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");
    }
asp.net-mvc
5个回答
38
投票

如果你想让它什么都不做,你可以返回一个 EmptyResult...

return new EmptyResult();

如果您使用 AjaxHelper,您可以通过提供不成功的状态代码(例如 404 或任何最合适的代码)来避免更新,这将阻止它替换您的 div,因为 MicrosoftMvcAjax.js 中的 javascript 显式检查是否成功响应在更新任何元素之前:-

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

最终避免这种情况的最好方法是设计局部视图,这样它首先就可以避免问题(就像你自己提到的那样)。


5
投票

我会用

return new HttpStatusCodeResult(204);

这样您就可以停留在同一页面上并且没有回发。 这是一个定义:

HTTP 204 No Content 成功状态响应代码表示 请求已成功,但客户端不需要离开当前页面

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204


4
投票

我今天遇到了这个问题。 我想找到一种解决方案来处理客户端的双击,并尝试在服务器端仍在处理时重新输入控制器操作。 如果用户输入该操作,我希望它忽略该请求,并且在浏览器端不执行任何操作。

解决方案如下所示:

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
投票

假设您正在使用 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 对话框插件或其他东西而不是警报。


0
投票

好的,我明白了。
虽然不能解决我的问题,但仍然解决了问题。

当视图显示最后一张图像时,我不会显示“下一步”链接。

不敢相信我没有早点想到......

谢谢大家的努力

© www.soinside.com 2019 - 2024. All rights reserved.