我想实现一种服务模式,为我的几个ASP.NET MVC控制器提供一些逻辑。根据逻辑结果,我可能希望控制器重定向,或者找不到404,或者其他各种响应。因此,我希望我的控制器能够从服务方法中接收out ActionResult
参数,以便他们返回以执行这些响应。
问题是我没有看到服务生成ActionResult
的任何方法。由于RedirectToAction()
类中的HttpNotFound()
和Controller
等方法设置为protected internal
,因此无法从服务类访问它们。
制作protected internal
背后的理由是什么?我的服务应该如何向控制器表明他们应该返回什么行动结果?
我可能想要做的一个例子是允许用户在多个地方设置配置变量(如果他们有权限)。控制器代码看起来像:
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;
}
答案 0 :(得分:1)
麻烦的是我没有看到服务生成ActionResults的任何方法。
与.NET中的任何对象一样,您可以使用其构造函数来创建实例。
就像那样:
var values = new RouteValueDictionary(new
{
action = "ViewVariablesList",
listId = variablesListId
});
actionRes = new RedirectToRouteResult(values);
至于为什么Controller类上的相应方法受到保护和内部,以及你可以向设计框架的人提出的问题。