代码之家  ›  专栏  ›  技术社区  ›  CubanX

Razor不容易处理强类型Html.ActionLink?

  •  13
  • CubanX  · 技术社区  · 14 年前

    各位,

    我们正在尝试使用如下所示的强类型操作链接方法:

    Html.ActionLink<HomeController>
    

    在剃刀视图引擎中。

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

    如果我试着像这样直接用在剃须刀上:

    @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");
    

    为简洁起见省略了很多内容:)如您所见,它将它拆分为“<”我认为它将其解释为一个HTML标记,但我不能确定。

    我找到了一个解决办法,但是很难看。这是有效的:

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

    有人知道更好的方法吗?

    3 回复  |  直到 14 年前
        1
  •  18
  •   marcind    14 年前

    是的,为了使用泛型方法,需要使用parens转义表达式。这行得通吗:

    @(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"))
    
        2
  •  1
  •   mcintyre321    11 年前

    我想你也可以: @Html.ActionLink((FooController c) => c.Edit(null), "New")

        3
  •  0
  •   NahuelGQ    13 年前

    这对我有效:

    @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”语句都是强制性的,否则它不起作用)