在字符串中包含剃刀语法

时间:2019-01-18 14:07:54

标签: asp.net asp.net-mvc asp.net-mvc-4 razor

我试图通过在控制器中构建html,然后在视图中呈现它来动态创建标签。都可以,但是对于选项卡内容,我希望它呈现一个动作。

我遇到的问题是@ Html.RenderAction代码被解释为字符串而不是Razor语法。

 model.TabHtml = model.TabHtml + @"<h3>" + role.title + "</h3>";
 model.TabHtml = model.TabHtml + @"@Html.RenderAction(""Index"", ""Matrix"", new {id = " + role.id + "})" ;
 model.TabHtml = model.TabHtml + @"</div>";

对此是否有解决方案,甚至还有其他解决方法?

它在我的视图中显示为.. view

1 个答案:

答案 0 :(得分:1)

简短答案: 您不能将Razor代码作为字符串从控制器传递到View,因为它将被解释为变量的值,但不能作为要运行的代码。

长答案: 您的尝试显示了对ASP.NET MVC框架的主要误解。 它基于MVC模式(用于模型视图控制器)构建。 虽然可以编写不严格遵循模式的代码,但是您的示例显示了一种简单地错误解释模式的方式。 视图负责构建HTML,而不负责控制器。控制器正在选择正确的视图,并将模型中的正确数据传递给它。您应该在这方面重新解决您的问题。

更具体地说: View的目标是构造HTML,并将其发送回客户端。 视图是.cshtml文件,即Razor文件。 Razor是一种非常接近C#语法的语言,可以与HTML混合使用,并用于构建HTML。 视图还不是HTML!

让我们举个例子: 控制器传递给视图的数据可以是List<string>,并且您的Razor代码可以通过以下方式为string中的每个List生成一个新的HTML段落:

@foreach(string s in ListOfString)
{
    <p>s</p>
}

此Razor代码需要运行,并且产生的HTML将是:

<p>content of the first string</p>
<p>content of the second string</p>
<p>content of the third string</p>
<p>content of the fourth string</p>

请注意,字符串的内容是Razor解析器的简单值,而不是要解析的代码。 这就解释了为什么此代码随后显示在您的页面上:永远不会将其解析为代码。

由于它不是HTML,因此客户端浏览器也不会解释它,只有基于ASP.NET MVC的服务器才能解释Razor代码。

使用模式的正确方法是:

在控制器中:

public IActionResult Foo()
{
    // Construct your data from Model here, and store it in a variable Bar of type MyType.
    Mytype Bar = SomeComputing(MyModel);
    // For instance Bar could have properties called Prop1, Prop2, Prop3, etc...
    return(Bar);
}

,并且Foo.cshtml文件中的View应该只是这样:

<!-- using the Bar data from the Controller -->
@model MyType 

<div class="@Model.Prop1">
    <h3>@Model.Prop2</h3>
    <p>@Model.Prop3</p>
    <a href="@Model.Prop4">Link</a>
</div>
相关问题