C# 为什么像RedirectToAction()和HttpNotFound()这样的控制器方法受到内部保护?
我想实现一个服务模式,为我的几个ASP.NET MVC控制器提供一些逻辑。根据逻辑的结果,我可能希望控制器重定向,或给出404NotFound或各种其他响应。因此,我希望我的控制器能够从服务方法接收C# 为什么像RedirectToAction()和HttpNotFound()这样的控制器方法受到内部保护?,c#,asp.net-mvc,C#,Asp.net Mvc,我想实现一个服务模式,为我的几个ASP.NET MVC控制器提供一些逻辑。根据逻辑的结果,我可能希望控制器重定向,或给出404NotFound或各种其他响应。因此,我希望我的控制器能够从服务方法接收out ActionResult参数,他们可以返回该参数来执行这些响应 问题是,我看不到服务生成ActionResults的任何方法。由于Controller类中的RedirectToAction()和HttpNotFound()等方法设置为protectedinternal,因此无法从服务类访问它们
out ActionResult
参数,他们可以返回该参数来执行这些响应
问题是,我看不到服务生成ActionResult
s的任何方法。由于Controller
类中的RedirectToAction()
和HttpNotFound()
等方法设置为protectedinternal
,因此无法从服务类访问它们
使它们受到内部保护的基本原理是什么?我的服务应该如何向控制器指示他们应该返回什么操作结果
我可能想做的一个例子是允许用户在多个地方设置一个配置变量,如果他们有权限的话。控制器代码类似于:
public ActionResult SetVariable(int variableId, int variableValue) {
ActionResult actionRes;
_svcVars.SetVariable(variableId, variableValue, out actionRes);
return actionRes;
}
public bool SetVariable(int variableId, int variableValue, out ActionResult actionRes) {
ConfigRepository repoConfig = new ConfigRepository();
if (!repoConfig.VariableExists(variableId)) {
actionRes = HttpNotFound("Could not find config variable");
return false;
}
if (!repoConfig.VariableMayBeChanged(variableId)) {
actionRes = Redirect("/ChangeForbidden.html");
return false;
}
int variablesListId = repoConfig.SetVariable(variableId, variableValue);
actionRes = RedirectToAction("ViewVariablesList", new { listId = variablesListId });
return true;
}
。。。服务代码看起来像:
public ActionResult SetVariable(int variableId, int variableValue) {
ActionResult actionRes;
_svcVars.SetVariable(variableId, variableValue, out actionRes);
return actionRes;
}
public bool SetVariable(int variableId, int variableValue, out ActionResult actionRes) {
ConfigRepository repoConfig = new ConfigRepository();
if (!repoConfig.VariableExists(variableId)) {
actionRes = HttpNotFound("Could not find config variable");
return false;
}
if (!repoConfig.VariableMayBeChanged(variableId)) {
actionRes = Redirect("/ChangeForbidden.html");
return false;
}
int variablesListId = repoConfig.SetVariable(variableId, variableValue);
actionRes = RedirectToAction("ViewVariablesList", new { listId = variablesListId });
return true;
}
问题是,我看不到服务生成ActionResults的任何方法
与.NET中的任何对象一样,您可以使用其构造函数来创建实例
就这样,
var values = new RouteValueDictionary(new
{
action = "ViewVariablesList",
listId = variablesListId
});
actionRes = new RedirectToRouteResult(values);
至于为什么控制器类上的相应方法是受保护的和内部的,您可以向设计框架的人员提出一个问题。您能用一个代码示例进一步解释一下您想要实现什么吗?奇怪的是,这些受保护的内部方法似乎只是实例化对象,而几乎不做任何其他事情。它们只是为了让代码“看起来更漂亮”,而没有新的
吗?是的,没错,它们只是为了让代码在控制器内看起来更短。实际上,我只是注意到没有一个重定向到ActionResult
,所以我猜这个方法做了一些隐蔽的工作来生成一个重定向到RouteResult
。是的,准确地说。这就是为什么我在回答中使用了RedirectToRouteResult
。您的示例代码是否等同于(在控制器中):RedirectToAction(“ViewVariablesList”,new{listId=variablesListId})代码>?