我认为Razor中的@
意味着C#代码。因此,在下面的代码中,我不会在@
之前给出另一个Html.Raw()
,因为它已经包含在C#代码中:
@if (Session["User"] == null)
{
Html.Raw("Welcome User <br>");
}
但事实证明,帮助者实际上需要@
才能表示上下文,如上所述here,否则它不会生成任何内容。
有人可以解释一下为什么会更详细吗?
答案 0 :(得分:10)
另一篇文章解释了为什么您需要@
代码前面的额外Html.Row
符号。
基本上你可以这样思考:
@
前面的第一个if
表示if块中的代码是C#代码,它将被解析为。
执行C#代码时,Html.Raw(...)
会生成一个MvcHtmlString
对象,但您实际上并没有对它做任何事情。如果您正在编写纯代码,那么您可能会写一些代码将MvcHtmlString
发送到响应输出缓冲区或类似的东西
因此,@
前面需要的第二个Html.Raw(..)
实际上是指定您希望在输出上下文中呈现函数结果的简单方法,而不是简单地留下悬挂。
另一个例子可能会有所帮助。此示例仅与您的Razor问题间接相关 - 关于执行函数和丢弃结果的概念。
假设您有以下函数定义:
int Add(int a, int b)
{
return a + b;
}
现在,您可以像这样调用此函数:
Add(2, 3);
上面的代码会执行添加,但结果将被丢弃。你没有做任何事情。与之对比:
Console.WriteLine(Add(2, 3)); // now the result is being written to the console