对于我们的web应用程序,我需要保存获取和显示项的顺序取决于视图-或者准确地说-生成视图的控制器和操作(当然还有用户id,但这不是这里的重点)。
而不是仅仅在每个控制器动作中给自己一个标识符(为了将它用于一些依赖于视图的DB输出排序),我认为从控制器和它被调用的动作方法中自动创建这个标识符会更安全更容易。
如何从控制器中的动作方法中获得控制器和动作的名称?还是说我需要反思一下?
对于我们的web应用程序,我需要保存获取和显示项的顺序取决于视图-或者准确地说-生成视图的控制器和操作(当然还有用户id,但这不是这里的重点)。
而不是仅仅在每个控制器动作中给自己一个标识符(为了将它用于一些依赖于视图的DB输出排序),我认为从控制器和它被调用的动作方法中自动创建这个标识符会更安全更容易。
如何从控制器中的动作方法中获得控制器和动作的名称?还是说我需要反思一下?
当前回答
你可以像任何变量一样从动作中获得控制器名或动作名。它们只是特殊的(控制器和动作),并且已经定义好了,所以你不需要做任何特殊的事情来获取它们,除了告诉你需要它们。
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;
}
其他回答
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues != null)
{
if (routeValues.ContainsKey("action"))
{
var actionName = routeValues["action"].ToString();
}
if (routeValues.ContainsKey("controller"))
{
var controllerName = routeValues["controller"].ToString();
}
}
为什么不做一些简单的事情呢?
只需调用请求。路径,它将返回一个以/分隔的字符串
然后你可以使用. split('/')[1]来获取控制器名称。
将此添加到GetDefaults()方法中的基本控制器中
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
GetDefaults();
base.OnActionExecuting(filterContext);
}
private void GetDefaults()
{
var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
}
实现你的控制器到Basecontroller
添加一个局部视图_Breadcrumb。CSHTML并将其添加到所有必需的页面中 @Html.Partial(“_Breadcrumb”)
_Breadcrumb.cshtml
<span>
<a href="../@ViewData["controllerName"]">
@ViewData["controllerName"]
</a> > @ViewData["actionName"]
</span>
这对我来说似乎工作得很好(到目前为止),如果您使用属性路由也同样有效。
public class BaseController : Controller
{
protected string CurrentAction { get; private set; }
protected string CurrentController { get; private set; }
protected override void Initialize(RequestContext requestContext)
{
this.PopulateControllerActionInfo(requestContext);
}
private void PopulateControllerActionInfo(RequestContext requestContext)
{
RouteData routedata = requestContext.RouteData;
object routes;
if (routedata.Values.TryGetValue("MS_DirectRouteMatches", out routes))
{
routedata = (routes as List<RouteData>)?.FirstOrDefault();
}
if (routedata == null)
return;
Func<string, string> getValue = (s) =>
{
object o;
return routedata.Values.TryGetValue(s, out o) ? o.ToString() : String.Empty;
};
this.CurrentAction = getValue("action");
this.CurrentController = getValue("controller");
}
}
删除对ToString()调用的需求
string actionName = ControllerContext.RouteData.GetRequiredString("action");
string controllerName = ControllerContext.RouteData.GetRequiredString("controller");