对于我们的web应用程序,我需要保存获取和显示项的顺序取决于视图-或者准确地说-生成视图的控制器和操作(当然还有用户id,但这不是这里的重点)。
而不是仅仅在每个控制器动作中给自己一个标识符(为了将它用于一些依赖于视图的DB输出排序),我认为从控制器和它被调用的动作方法中自动创建这个标识符会更安全更容易。
如何从控制器中的动作方法中获得控制器和动作的名称?还是说我需要反思一下?
对于我们的web应用程序,我需要保存获取和显示项的顺序取决于视图-或者准确地说-生成视图的控制器和操作(当然还有用户id,但这不是这里的重点)。
而不是仅仅在每个控制器动作中给自己一个标识符(为了将它用于一些依赖于视图的DB输出排序),我认为从控制器和它被调用的动作方法中自动创建这个标识符会更安全更容易。
如何从控制器中的动作方法中获得控制器和动作的名称?还是说我需要反思一下?
当前回答
可能会有用。我需要控制器的构造函数中的动作,它出现在MVC生命周期的这一点上,这还没有初始化,ControllerContext = null。我没有深入研究MVC生命周期,也没有找到要重写的适当函数名,而是在RequestContext.RouteData中找到了动作。
但是为了这样做,就像构造函数中任何与HttpContext相关的用法一样,你必须指定完整的命名空间,因为这。HttpContext也没有初始化。幸运的是,System.Web.HttpContext.Current看起来是静态的。
// controller constructor
public MyController() {
// grab action from RequestContext
string action = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action");
// grab session (another example of using System.Web.HttpContext static reference)
string sessionTest = System.Web.HttpContext.Current.Session["test"] as string
}
注意:可能不是最受支持的方式来访问HttpContext中的所有属性,但对于RequestContext和Session,它似乎在我的应用程序中工作得很好。
其他回答
可能会有用。我需要控制器的构造函数中的动作,它出现在MVC生命周期的这一点上,这还没有初始化,ControllerContext = null。我没有深入研究MVC生命周期,也没有找到要重写的适当函数名,而是在RequestContext.RouteData中找到了动作。
但是为了这样做,就像构造函数中任何与HttpContext相关的用法一样,你必须指定完整的命名空间,因为这。HttpContext也没有初始化。幸运的是,System.Web.HttpContext.Current看起来是静态的。
// controller constructor
public MyController() {
// grab action from RequestContext
string action = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action");
// grab session (another example of using System.Web.HttpContext static reference)
string sessionTest = System.Web.HttpContext.Current.Session["test"] as string
}
注意:可能不是最受支持的方式来访问HttpContext中的所有属性,但对于RequestContext和Session,它似乎在我的应用程序中工作得很好。
删除对ToString()调用的需求
string actionName = ControllerContext.RouteData.GetRequiredString("action");
string controllerName = ControllerContext.RouteData.GetRequiredString("controller");
试试这段代码
将这个重写方法添加到控制器
protected override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
{
var actionName = actionExecutingContext.ActionDescriptor.ActionName;
var controllerName = actionExecutingContext.ActionDescriptor.ControllerDescriptor.ControllerName;
base.OnActionExecuting(actionExecutingContext);
}
下面是一些获取信息的扩展方法(它也包括ID):
public static class HtmlRequestHelper
{
public static string Id(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("id"))
return (string)routeValues["id"];
else if (HttpContext.Current.Request.QueryString.AllKeys.Contains("id"))
return HttpContext.Current.Request.QueryString["id"];
return string.Empty;
}
public static string Controller(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("controller"))
return (string)routeValues["controller"];
return string.Empty;
}
public static string Action(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("action"))
return (string)routeValues["action"];
return string.Empty;
}
}
用法:
@Html.Controller();
@Html.Action();
@Html.Id();
你可以像任何变量一样从动作中获得控制器名或动作名。它们只是特殊的(控制器和动作),并且已经定义好了,所以你不需要做任何特殊的事情来获取它们,除了告诉你需要它们。
public string Index(string controller,string action)
{
var names=string.Format("Controller : {0}, Action: {1}",controller,action);
return names;
}
或者你可以在你的模型中包含控制器,动作来获得其中的两个和你的自定义数据。
public class DtoModel
{
public string Action { get; set; }
public string Controller { get; set; }
public string Name { get; set; }
}
public string Index(DtoModel baseModel)
{
var names=string.Format("Controller : {0}, Action: {1}",baseModel.Controller,baseModel.Action);
return names;
}