我试图通过在控制器中构建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
发布于 2019-01-19 08:14:26
简而言之:您不能将Razor代码作为字符串从您的控制器传递到您的视图,因为它将被解释为变量的值,而不是要运行的代码。
冗长的回答:您的尝试显示了对ASP.NET MVC框架的严重误解。它是基于MVC模式构建的,用于Model View Controller。虽然可以编写不严格遵循该模式的代码,但您的示例显示了一种简单地错误解释该模式的方法。视图负责HTML的构建,而不是控制器。控制器正在选择正确的视图,并将模型中的正确数据传递给它。你应该在这方面重新定义你的问题。
更具体地说: View的目标是构造可以发送回客户端的HTML。视图是.cshtml文件,即Razor文件。Razor是一种非常接近C#语法的语言,它可以与超文本标记语言混合使用,并用于构建超文本标记语言。视图还不是HTML!
让我们举个例子:控制器传递给视图的数据可以是一个List<string>
,你的Razor代码可以用下面的方式为你的List
中的每个string
生成一个新的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解析器来说是简单的值,而不是要解析的代码。这就解释了为什么这段代码会显示在您的页面上:它永远不会被解析为代码。
因为它不是超文本标记语言,所以客户端浏览器也无法解释它,只有基于Razor的服务器能够解释ASP.NET代码。
使用该模式的正确方法是:
在控制器中:
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文件中的视图应该类似于:
<!-- 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>
https://stackoverflow.com/questions/54255674
复制相似问题