代码之家  ›  专栏  ›  技术社区  ›  Dave Van den Eynde

为什么我不能在ASP.NET MVC视图的两个内容部分之间共享变量?

  •  1
  • Dave Van den Eynde  · 技术社区  · 14 年前

    我有一个ASP.NET MVC视图,具有典型的TitleContent和MainContent,其标题相当复杂,我想计算一次,然后在这两个内容部分之间共享,如下所示:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    <%
        var complicatedTitle = string.Format("{0} - {1}", Model.FirstThing, Model.SecondThing);
    %>
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        <%: complicatedTitle %>
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    
        <h2><%: complicatedTitle %></h2>
    
    </asp:Content>
    

    但是,这不起作用,因为产生的错误消息会说,在包含内容控件的内容页中,只允许直接使用内容控件。

    计算确实属于视图。你如何解决这个问题?

    3 回复  |  直到 14 年前
        1
  •  4
  •   David Neale    14 年前

    代码不能位于内容控件之外的原因是它需要位于某种类型的服务器端部分中,以便服务器能够自动呈现它。

    我建议在控制器操作方法中构造此标题并将其保存到 ViewData .

        2
  •  0
  •   Dave Van den Eynde    14 年前

    另一种方法是专门添加一个HTML助手来生成格式良好的标题。

    public static string FormattedTitle(this HtmlHelper helper, string firstPart, string secondPart)
    {
        return firstPart + secondPart;
    }
    

    然后用调用它

    <%: Html.FormattedTitle(firstPart, secondPart) %>
    
        3
  •  0
  •   Community CDub    7 年前

    这里是 单程 : [编辑:看起来这一个结果是静态字段-所以不要使用这个-抱歉]

    <Script runat="server" language="C#">
        string foo = "first thing " + " second thing";
    </Script>
    
    <asp:Content ContentPlaceHolderID="head" runat="server">
        <%= foo %>
    </asp:Content>
    
    <asp:Content ContentPlaceHolderID="body" runat="server">
        <%= foo %>
    </asp:Content>
    

    (注意,脚本中不能使用'var')

    和A 第二条道路 :

    • 使用代码隐藏来计算具有 ComplicatedTitle 对视图私有的属性。您仍然完全依赖于视图来执行逻辑,但是将其从视图的HTML部分中去掉——毕竟您的aspx和aspx.cs文件最终会变成相同的类!
    • 有些人被视图中的代码吓坏了,但是 I think it definitely has its place 如果你谨慎而明智

    和A 第三条道路 :

    我假设你不想在你的模型中制造第三个属性,但如果它看起来合适的话,这里有一个快速而肮脏的方法。至少你的控制器没有这样做,但这可能不是最好的方法。

    public class MyModel {
    
       public string Prop1 {get;set;}
       public string Prop2 {get;set;}
    
       public string GetFormattedTitle() {
          return Prop1 + " - " + Prop2;
       }    
    }