【问题标题】:HOW? Controller return nothing/current view如何?控制器不返回任何内容/当前视图
【发布时间】:2009-02-23 21:13:35
【问题描述】:

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

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

【问题讨论】:

  • 就像我正在寻找的一样,但还没有答案。下面是令人耳目一新的页面,我什至不喜欢。由于我的 javascript/jquery 更新了用户界面,并且服务器端没有更新 UI 上的任何内容,只需要一个标志来查看我的控制器是否成功执行某些任务。如果是,我使用 javascript/jquery 更新 UI,如果不是,则仅使用它再次更新某些内容(如复选标记)。我喜欢保留所有其他页面内容,因为它没有刷新效果,会杀死用户操作的 javascript 更改。下面的答案。不工作,因为它返回空白视图。

标签: asp.net-mvc


【解决方案1】:

如果你不希望它做任何事情,你可以返回一个 EmptyResult...

return new EmptyResult();

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

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

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

【讨论】:

  • 好吧实际上它做了一些事情,它返回一个空结果。与返回 null 相同。这只是显示空内容。这不是我想要它做的。我希望它……嗯……什么都不做,摆脱困境,保持当前视图不变。没有更新。 :)
  • 那么您是通过 AJAX 调用它,所以它必须接收来自 XMLHttpRequest 的响应?只需检查成功回调中结果的长度,如果它大于 0,则用新的 HTML 片段替换内容,否则保持原样。
  • 我正在使用“内置”ajax: 希望有一个简单的解决方案,不需要粗暴的 javascript 等。
【解决方案2】:

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

解决方案如下:

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

【讨论】:

  • return new HttpStatusCodeResult(204) 是我正在寻找的答案。 return new EmptyResult() 生成了一个空白页。
【解决方案3】:

我会用

return new HttpStatusCodeResult(204);

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • return JavaScript( "alert('No more images');" ); 导致我的视​​图变为纯文本alert('No more Images');
    【解决方案5】:

    好的,我知道了。
    不能解决我的问题,但仍然可以解决问题。

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

    不敢相信我之前没有想到...

    感谢你们的努力

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2019-07-03
      相关资源
      最近更新 更多