gpt4 book ai didi

asp.net-mvc - .NET MVC : How to redirect response within a helper method

转载 作者:行者123 更新时间:2023-12-05 02:25:05 25 4
gpt4 key购买 nike

我有一些代码,这些代码对于我的许多 Controller 操作是通用的,它们被提取到一个私有(private)的“帮助程序”方法中,只是为了整合。该方法应该为我“获取”一个对象,尽管它会执行一些合理性/安全性检查并可能将用户重定向到其他操作。

private Thingy GetThingy(int id)
{
var thingy = some_call_to_service_layer(id);

if( null == thingy )
Response.Redirect( anotherActionUrl );

// ... many more checks, all more complex than a null check

return thingy;
}

public ActionResult ActionOne(int id)
{
var thingy = GetThingy(id);
// do more stuff
return View();
}

// ... n more actions

public ActionResult ActionM(int id)
{
var thingy = GetThingy(id);
// do more stuff
return View();
}

除 Elmah 然后通知我异常外,此功能正常运行:

System.Web.HttpException: Cannot redirect after HTTP headers have been sent.

所以,我的问题是:是否有更正确的方法来完成我想做的事情?本质上,我想要的只是让当前操作停止处理,而是返回一个 RedirectToRouteResult。

最佳答案

您不能在不中断导致错误的执行流程的情况下在操作中调用 Response.Redirect()。相反,您可以返回一个 RedirectToRouteResult 对象或一个 RedirectResult 对象。在你的行动中

return Redirect("/path");
//or
return RedirectToAction("actionname");

在您的情况下,您想要返回一个 Thingy 对象,您需要将逻辑分开。您可以执行类似以下操作(我假设您想重定向到不同的操作,否则 Oenning 的代码将起作用)

public ActionResult Get(int id) {

var thingy = GetThingy(id);

var result = checkThingy(thingy);
if (result != null) {
return result;
}

//continue...
}

[NonAction]
private ActionResult CheckThingy(Thingy thingy) {

//run check on thingy
//return new RedirectResult("path");

//run another check
//new RedirectResult("different/path");

return null;
}

更新您可以将此代码放在扩展方法或基 Controller 类中

public static class ThingyExtensions {

public static ActionResult Check(this Thingy thingy) {
//run checks here
}

}

关于asp.net-mvc - .NET MVC : How to redirect response within a helper method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5043872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com