我似乎很难得到一些应该很容易的东西。在我看来,使用Razor,我想得到当前控制器的名称。例如,如果我在这里:
http://www.example.com/MyController/Index
如何从Razor表达式中获取控制器名称MyController
:
@* Obviously this next line doesn't work
@Controller.Name
*@
我是MVC的新手,所以如果这是一个明显的答案,请不要攻击我。
答案 0 :(得分:71)
@{
var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();
}
OR
@{
var controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}
答案 1 :(得分:33)
Koti Panga答案的附录:他提供的两个例子是不等同。
这将返回处理执行此代码的视图的控制器的名称:
var requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
这将返回URL中请求的控制器的名称:
SiteMenuPartial
虽然在大多数情况下这些肯定是相同的,但在某些情况下,您可能会在属于不同控制器的局部视图中,并希望获得控制器的名称"更高级别"在链中,在这种情况下需要第二种方法。
例如,假设您有一个部分视图负责呈现网站的菜单链接。因此,对于您网站中的每个网页,都会准备链接,并通过LayoutController
中名为/Home/Index
的操作传递给视图。
因此,当您加载SiteMenuPartial
时,将检索布局页面,布局页面将调用SiteMenuPartial.cshtml
方法,并返回/* Executes at the top of SiteMenuPartial.cshtml */
@{
// returns "Layout"
string handlingController = this.ViewContext.RouteData.Values["controller"].ToString();
// returns "Home"
string requestedController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
}
局部视图。如果在该局部视图中,您要执行以下两行代码,则它们将返回显示的值:
Sub Compare()
Dim Dic As Object
Dim fso As Object
Dim fldStart As Object
Dim fl As Object
Dim Mask As String, i As Long
Dim Wbk As Worksheet, w1 As Worksheet
Set fso = CreateObject("scripting.FileSystemObject")
Set fld = fso.GetFolder("C:\Users\kelvinwong\Desktop\Survey Testing")
Set w1 = Workbooks("Book1.xlsm").Sheets("Sheet1")
Set Dic = CreateObject("Scripting.Dictionary")
Mask = "*.xlsx"
For Each fl In fld.Files
If fl.Name Like Mask Then
Set Wbk = Workbooks.Open(fld & "\" & fl.Name).Sheets("Sheet1")
i = Wbk.Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In Wbk.Range("A2:A" & i)
If Not Dic.exists(oCell.Value) Then
Dic.Add oCell.Value, oCell.Offset(, 0).Value
End If
Next oCell
End If
Next fl
i = w1.Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In w1.Range("A2:A" & i)
For Each key In Dic
If oCell.Value = key Then
oCell.Offset(, 2).Value = Dic(key)
End If
Next
Next
End Sub
答案 2 :(得分:6)
@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
MVC 3
@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
MVC 4.5
@ViewContext.RouteData.Values["controller"].ToString();
答案 3 :(得分:3)
无需ToString()
来电使用
@ViewContext.RouteData.GetRequiredString("controller")
答案 4 :(得分:1)
此外,如果您想获得完整控制器的名称(“Controller”结尾),您可以使用:
ViewContext.Controller.GetType().Name
答案 5 :(得分:-4)
@ ViewContext.RouteData.Values ["控制器&#34]的ToString();