在asp.net mvc中寻找有关Razor语法的指南

时间:2013-07-17 13:35:46

标签: asp.net-mvc

我正在学习asp.net mvc刚刚通过在线教程

1) just see <span>@model.Message</span> and @Html.Raw(model.Message)

假设如果“Hello Word”存储在Message中,那么如果我写了类似的语句,则应显示“Hello Word” <span>@model.Message</span>但我无法理解@Html.Raw(model.Message)的特殊目的是什么。 什么@Html.Raw() will render

请与更多示例讨论,以便更好地理解差异。

2)只看到以下两个代码段

@if (foo) {
  <text>Plain Text</text> 
}

@if (foo) {
  @:Plain Text is @bar
}

引入了哪个版本的html标签。是等同于

还是什么?是什么目的 这个标签?

告诉我这个@:Plain Text is @bar @的特殊含义是什么? 如果我们的意图是将文本与表达混合,那么我们就不能像普通文本一样写@bar

3) <span>ISBN@(isbnNumber)</span> 什么会打印?如果2000存储在isbnNumber变量中,则它可以打印<span>ISBN2000</span>. am i right ?

请告诉我@(variable-name)为什么括号和@符号有什么特殊含义?

4)只看

<span>In Razor, you use the 
@@foo to display the value 
of foo</span>

如果foo具有名为god的值那么@@foo会打印出什么?

5)看到这一点并指导我在下面给出的更多语法

a) @(MyClass.MyMethod<AType>())

b)

@{
  Func<dynamic, object> b = 
   @<strong>@item</strong>;
}
@b("Bold this")

c) <div class="@className foo bar"></div>

6)看到这个

@functions
{
string SayWithFunction(string message)
{
return message;
}
}
@helper SayWithHelper(string message)
{

Text: @message

}
@SayWithFunction("Hello, world!")
@SayWithHelper("Hello, world!")

他们想要宣布什么?功能? 它是什么样的语法? 似乎两个函数已经以两种不同的方式声明了?请用更多样本解释这一点。感谢

几乎没有问题

7)

@{
  Func<dynamic, object> b = @<strong>@item</strong>;
}
<span>This sentence is @b("In Bold").</span>

上面的含义是什么?是匿名代表吗? 当有人打电话给@b("In Bold")时会发生什么?

8)     @ {       var items = new [] {“one”,“two”,“three”};     }

<ul>
@items.List(@<li>@item</li>)
</ul>

告诉我一些关于List()函数以及item变量来自哪里?

9)

@{
    var comics = new[] { 
        new ComicBook {Title = "Groo", Publisher = "Dark Horse Comics"},
        new ComicBook {Title = "Spiderman", Publisher = "Marvel"}
    };
}

<table>
@comics.List(
  @<tr>
    <td>@item.Title</td>
    <td>@item.Publisher</td>
  </tr>)
</table>

请简要说明上面的代码。感谢

2 个答案:

答案 0 :(得分:1)

1)任何类型的@Variable输出都会使MVC自动编码该值。也就是说,如果foo = "Joe & Dave",则@foo会自动变为Joe &amp; Dave。要逃避此行为,您需要@Html.Raw

2) <text></text>可在解析器遇到问题时为您提供帮助。你必须记住Razor使用语言的语义进出HTML / Code。也就是说,它知道它是使用XML解析器的HTML,以及它在C#/ VB中的语法(分别如大括号或Then..End)。如果您想偏离此格式,可以使用<text>。 e.g。

<ul>
    <li>
        @foreach (var item in items) {
          @item.Description
          <text></li><li></text>
        }
    </li>
</ul>

这里你正在搞乱解析器,因为它不再符合“标准”HTML块。 </li>通过剃刀进行循环,但因为它包含在<text></text>中,所以它有更明确的方式来了解代码的结束位置和HTML的开始。

3)是的,括号内有助于为解析器提供一个显式定义应该执行的内容。 Razor尽最大努力去理解你想要输出的东西,但有时它会关闭。括号解决了这个问题。 e.g。

@Foo.bar

如果您只将@Foo定义为字符串,Razor将不可避免地尝试寻找bar属性,因为它遵循C#的命名约定(这在C#中是一个非常有效的表示法,但不是我们的意图)。因此,为避免继续使用,我们可以使用括号:

@(Foo).bar

一个值得注意的例外是当有一个尾随时期。 e.g。

Hello, @name.

Razor解析器实现后面没有任何有效的(就语言而言),所以它只输出name和之后的一段时间。

当您需要实际打印@@时,

4) @是剃刀的转义方法。因此,在您的示例中,您将在纯文本页面上看到@foo。这在直接在页面上输出电子邮件地址时非常有用,例如

bchristie@@contoso.com

现在剃刀不会寻找contoso.com变量。

5)您会看到各种快捷方式以及您如何在有效的C#代码与HTML之间进行反弹的用法。请记住,你可以介入,你看到的HTML实际上只是一个最终输出到缓冲区的编译IHtmlString

答案 1 :(得分:0)

1

默认情况下,Razor会自动对输出值进行html编码(<div>变为&lt;div&gt;)。如果您明确希望在没有任何编码的情况下按原样输出值,则应使用@Html.Raw(在<script>中间输出JSON字符串非常常见)。


2

<text>@:的目的是逃避常规Razor语法流和输出文字文本值。例如:

// i just want to print "Haz It" if some condition is true
@if (Model.HasSomething) { Haz It } // syntax error
@if (Model.HasSomething) { <text>Haz It</text> } // just fine

@:开始,它会在下一个换行符(输入)之前开始文本文字,因此:

@if (Model.HasSomething) { @:Haz It } // syntax error, no closing '}' encountered

// just fine
@if (Model.HasSomething)
{
    @:Haz It
}

第3

默认情况下,如果您的@位于引号/双引号(<tr id="row@item.Id")内,则Razor会将其解释为文字,并且不会尝试将其解析为表达式(出于显而易见的原因),但有时你想要它,然后你只需写<tr id="row@(item.Id")


4

@@的目的只是逃避'@'。当你想输出'@'并且不希望Razor解释为表达式时。然后在你的情况下@@foo将打印'@foo'。


5

a。 @(MyClass.MyMethod<AType>())只会输出方法的返回值(必要时使用ToString())。

b。是的,Razor确实允许您定义某种内联函数,但通常最好使用Html Helpers / Functions / DisplayTemplates(如如下)。

c。见上文。


6

Razor Helpers 开始,请参阅http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx