2013-04-23 1 views
4
@helper GetString() 
{ 
    @string.Format("string_{0}","foo");    
} 

Выше код не будет компилироваться в ASP.NET MVC 4.0 с Razor 2.0. Но если я удалю '@' до string.Format, тогда код компилируется, но строка не будет выводиться на сгенерированный HTML. Почему это? В MVC 3.0 с Razor 1.x выше код работает, как ожидалось. Я прокладываю это под кодом ниже, вводя переменнуюбритва с MVC4.0 вспомогательный выход с вызовом метода

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

Почему это?

ответ

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

Приведенный выше код не компилируется в ASP.NET MVC 4.0 с Razor 2.0.

Это потому, что бритва двигатель будет видеть, что у вас есть конструкция (например, строка в вашем примере), и вы используете @ избыточность. Это не скомпилируется, как вы это пережили.

Но если удалить «@» перед string.Format, код компилируется, но строка не будет outputed к сгенерированной HTML.

Ничего не выйдет, потому что вы не сказали движку бритвы, что писать. Вы только что сделали код. Это похоже на выполнение в C# и делает string.Format и не присваивает его переменной.

Я Walkaround это с ниже код, введя переменную

В связи с тем, что я уже упоминал ранее, как только вы ввели переменную и написал, теперь вы говорите бритвы двигатель до вывести что-то. Это похоже на AC# консольного приложения, в котором:

  • вы сделали string.Format: string.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> 
}