razor与MVC4.0辅助输出与方法调用

时间:2013-04-23 03:32:27

标签: c# .net asp.net-mvc-4 razor-2

@helper GetString()
{
    @string.Format("string_{0}","foo");               
}

上面的代码不能在带有Razor 2.0的ASP.NET MVC 4.0中编译。但是如果我在string.Format之前删除'@',那么代码会编译,但字符串不会输出到生成的HTML。这是为什么?在使用Razor 1.x的MVC 3.0中,上面的代码按预期工作。我通过引入变量

来解决这个问题
@helper GetString()
{
    var url = string.Format("string_{0}","foo");               
    @url
}

为什么会这样?

1 个答案:

答案 0 :(得分:2)

@helper GetString()
{
    @string.Format("string_{0}","foo");               
}
  

上面的代码不能在带有Razor 2.0的ASP.NET MVC 4.0中编译。

这是因为剃刀引擎会看到你有一个构造(例如你的例子中的字符串)并且你正在冗余地使用@。这不会像你经历的那样编译。

  

但是如果我在string.Format之前删除'@',那么代码会编译,但是   该字符串不会输出到生成的HTML。

没有任何东西会被输出,因为你没有告诉剃须刀引擎要写什么。你刚刚做了一些代码。它类似于在c#中执行并执行string.Format而不是将其分配给变量。

  

我通过引入变量

来解决这个问题

与我前面提到的相关,在你引入变量并编写它的那一刻,你现在告诉剃刀引擎输出一些东西。这与c#console应用程序类似,其中:

  • 你做了string.Formatstring.Format("string_{0}","foo");
  • 将其输出分配给变量:var url = string.Format("string_{0}","foo");
  • 打印变量:@url

您可以read this blog post更好地了解剃刀引擎在@的使用方面的工作原理。

现在替代你正在做的事情,你可以这样做:

@helper GetString()
{        
    <text>@string.Format("string_{0}", "foo")</text>
}