怎么样?控制器返回任何/当前视图

时间:2009-02-23 21:13:36

标签: asp.net-mvc

SHORT:
如何让控制器返回当前视图或只是什么都不做?

LONG:
我有一个部分视图,我已经创建了一个imageslider。 它包含一个链接,它向控制器发送请求以获取下一个图像(使用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");
    }

5 个答案:

答案 0 :(得分:26)

如果你想让它无所事事,你可以返回一个EmptyResult ......

return new EmptyResult();

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

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

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

答案 1 :(得分:1)

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

解决方案如下:

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除了保存文件之外也不会真正影响当前页面。

答案 2 :(得分: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对话框插件或其他内容而不是警报。

答案 3 :(得分:0)

好的,我知道了。
不是我的问题的解决方案,但仍解决问题。

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

简直不敢相信我没想到它......
感谢你们的努力

答案 4 :(得分:0)

我会用

return new HttpStatusCodeResult(204);

这样,您将停留在同一页上,并且没有任何回发。 这就是定义

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