Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么像RedirectToAction()和HttpNotFound()这样的控制器方法受到内部保护?_C#_Asp.net Mvc - Fatal编程技术网

C# 为什么像RedirectToAction()和HttpNotFound()这样的控制器方法受到内部保护?

C# 为什么像RedirectToAction()和HttpNotFound()这样的控制器方法受到内部保护?,c#,asp.net-mvc,C#,Asp.net Mvc,我想实现一个服务模式,为我的几个ASP.NET MVC控制器提供一些逻辑。根据逻辑的结果,我可能希望控制器重定向,或给出404NotFound或各种其他响应。因此,我希望我的控制器能够从服务方法接收out ActionResult参数,他们可以返回该参数来执行这些响应 问题是,我看不到服务生成ActionResults的任何方法。由于Controller类中的RedirectToAction()和HttpNotFound()等方法设置为protectedinternal,因此无法从服务类访问它们

我想实现一个服务模式,为我的几个ASP.NET MVC控制器提供一些逻辑。根据逻辑的结果,我可能希望控制器重定向,或给出404NotFound或各种其他响应。因此,我希望我的控制器能够从服务方法接收
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})