我正在学习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>
请简要说明上面的代码。感谢
答案 0 :(得分:1)
1)任何类型的@Variable
输出都会使MVC自动编码该值。也就是说,如果foo = "Joe & Dave"
,则@foo
会自动变为Joe & 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)
默认情况下,Razor会自动对输出值进行html编码(<div>
变为<div>
)。如果您明确希望在没有任何编码的情况下按原样输出值,则应使用@Html.Raw
(在<script>
中间输出JSON字符串非常常见)。
<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
}
默认情况下,如果您的@
位于引号/双引号(<tr id="row@item.Id"
)内,则Razor会将其解释为文字,并且不会尝试将其解析为表达式(出于显而易见的原因),但有时你做想要它,然后你只需写<tr id="row@(item.Id")
。
@@
的目的只是逃避'@'。当你想输出'@'并且不希望Razor解释为表达式时。然后在你的情况下@@foo
将打印'@foo'。
a。 @(MyClass.MyMethod<AType>())
只会输出方法的返回值(必要时使用ToString()
)。
b。是的,Razor确实允许您定义某种内联函数,但通常最好使用Html Helpers
/ Functions
/ DisplayTemplates
(如如下)。
c。见上文。
从 Razor Helpers 开始,请参阅http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx