简短:
如何让控制器返回当前视图或只是不执行任何操作?
长:
我有一个创建图像滑块的部分视图。
它包含一个链接,该链接向控制器发送请求以获取下一个图像(使用 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");
}
如果你想让它什么都不做,你可以返回一个 EmptyResult...
return new EmptyResult();
如果您使用 AjaxHelper,您可以通过提供不成功的状态代码(例如 404 或任何最合适的代码)来避免更新,这将阻止它替换您的 div,因为 MicrosoftMvcAjax.js 中的 javascript 显式检查是否成功响应在更新任何元素之前:-
this.ControllerContext.HttpContext.Response.StatusCode = 404;
return new EmptyResult();
最终避免这种情况的最好方法是设计局部视图,这样它首先就可以避免问题(就像你自己提到的那样)。
我会用
return new HttpStatusCodeResult(204);
这样您就可以停留在同一页面上并且没有回发。 这是一个定义:
HTTP 204 No Content 成功状态响应代码表示 请求已成功,但客户端不需要离开当前页面
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
我今天遇到了这个问题。 我想找到一种解决方案来处理客户端的双击,并尝试在服务器端仍在处理时重新输入控制器操作。 如果用户输入该操作,我希望它忽略该请求,并且在浏览器端不执行任何操作。
解决方案如下所示:
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 也不会真正影响当前页面。
假设您正在使用 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 对话框插件或其他东西而不是警报。
好的,我明白了。
虽然不能解决我的问题,但仍然解决了问题。
当视图显示最后一张图像时,我不会显示“下一步”链接。
不敢相信我没有早点想到......
谢谢大家的努力