使用强类型的Html.ActionLink,Razor无法轻松工作?

时间:2010-11-11 21:01:19

标签: asp.net-mvc-3 razor

民间,

我们正在尝试使用类似于此的强类型操作链接方法:

Html.ActionLink<HomeController>
在Razor视图引擎中

我知道我们不应该一直使用它们,因为它忽略了过滤器等,但事实是我们确实使用它们。

如果我尝试在Razor中直接使用它,就像这样:

@Html.ActionLink<HomeController>(c => c.Index, "Home")

我收到错误:

CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments

如果你看看编译后的代码,那是因为Razor没有像你期望的那样解析那个语句。已编译的源,来自具有该行的错误如下所示:

...
Line 101:              #line 13 "C:\dev\TheNetwork\POC\Web\Views\Policy\Edit.cshtml"
Line 102:  Write(Html.ActionLink);
Line 103:  
Line 104:              
Line 105:              #line default
Line 106:              #line hidden
Line 107:  WriteLiteral("<PolicySectionController>(c => c.Edit(null), "New\")\r\n\r\n\r\n\r\n");

为了简洁省略了很多东西:)正如你所看到的,它将它拆分为“&lt;”我认为它将其解释为HTML标记,但我无法确定。

我找到了一个解决方法,但它很难看。这有效:

@{Write(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"));}

有谁知道更好的方法吗?

3 个答案:

答案 0 :(得分:18)

是的,为了使用泛型方法,您需要使用parens来转义表达式。这会有用吗?

@(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"))

答案 1 :(得分:1)

我认为你也可以这样做: @Html.ActionLink((FooController c) => c.Edit(null), "New")

答案 2 :(得分:0)

这对我有用:

@using MyProjectNamespace.Controllers;
@using Microsoft.Web.Mvc; // MVC Futures
@{
    ViewBag.Title = "Index";
}
<h1>Index</h1>
@(Html.ActionLink<FooController>(f => f.Index(), "Go (Strongly Typed)"))

(两个“@using”语句都是必需的,否则它不起作用)