【问题标题】:Include Razor Syntax in string在字符串中包含 Razor 语法
【发布时间】:2019-06-12 19:39:05
【问题描述】:

我试图通过在控制器中构建 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

【问题讨论】:

  • 你为什么不能使用PartialView呢?
  • 我可以,但我仍然会遇到@Html.RenderPartial 是我的 TabHtml 字符串的一部分并且不被识别为 Razor 语法的问题
  • 好的,那么你打算如何处理这个model.TabHtml?另外,你是在控制器上设置这个值吗?
  • 您可能会发现this post 很有用。
  • 它在我的视图中显示为
    @Html.Raw(Model.TabHtml)

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


【解决方案1】:

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

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

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

我们举个例子: 控制器传递给视图的数据可以是 List&lt;string&gt;,您的 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 解析器的简单值,而不是要解析的代码。 这就解释了为什么这段代码会显示在您的页面上:它永远不会被解析为代码。

由于它不是 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 文件中的视图应该是这样的:

<!-- 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2012-07-26
    • 2014-05-07
    • 1970-01-01
    • 2016-08-12
    • 2016-11-20
    相关资源
    最近更新 更多