【问题标题】:ASP.Net MVC 3 Razor: how to create and pass info to a dynamic layoutASP.Net MVC 3 Razor:如何创建信息并将其传递给动态布局
【发布时间】:2011-06-06 07:21:36
【问题描述】:

在其他语言(PHP/Python)中,我习惯于创建一个代表给定 HTML 页面布局的类。这些类可以有无限数量的属性和动态特性,例如导航(多级)、错误消息、信息消息、页脚文本等......这些项目中的大多数都有默认值,但可能会在每页上被覆盖等级。例如:

Layout = MainPage()

Layout.Title = "Google Image Search"

Layout.Nav1.Add("Google", "http://www.google.com", Selected=True)
Layout.Nav1.Add("Yahoo", "http://www.yahoo.com")
Layout.Nav1.Add("Bing", "http://www.bing.com")

Layout.Nav2.Add("Google Image Search", "http://......", Selected=True)
Layout.Nav2.Add("Google Shopping Search", "http://......")
Layout.Nav2.Add("Google Video Search", "http://......")
Layout.Nav2.Add("Google Web Search", "http://......")

或者,处理错误:

try:
   # do something
except ValidationError as e:
   Layout.Error.Add(e)

或一个php示例:

$Layout->Info[] = "Your changes have been saved!";

我的问题是:如何在 ASP.Net MVC 3 Razor (VB) 中实现类似的功能?

到目前为止,我已经了解了如何使用ViewData 将各种数据位传递给视图。此外,我一直在使用强类型视图。

坦率地说,我不确定谁的工作是拥有这个逻辑、控制器或视图(或者是否有一个模型应该在某个地方)。

以下是我正在拍摄的内容的摘要:

  1. 一个用于初始化布局默认值的地方(如第一层导航等...)
  2. 强类型属性,例如Public Readonly Property Nav1 as List(of NavElement)
  3. 以及一个渲染这些布局元素的地方(我假设_Layout.vbhtml

请原谅这篇文章的各处...我试图找出在一个新的(Razor)和对我来说都是新的平台(ASP.Net MVC)上完成的“正确方法” )。

欢迎大家多多指教!

【问题讨论】:

    标签: asp.net vb.net asp.net-mvc-3 razor


    【解决方案1】:

    我通常有一个控制器属性 (MainMenu),我将其添加到 BaseController 中 Controller.OnResultExecutingViewData 字典中。请注意,它在 mvc3 中被命名为 ViewBag,它是一个动态对象。

    另一种方法是使用剃须刀中的部分。看这个问题:ContentPlaceHolder in Razor?

    【讨论】:

    • 感谢您的验证和澄清。
    【解决方案2】:

    我倾向于fat models, skinny controllers 视角。如果是我,我会为您的页面模型创建一个基类,为您的公共数据提供支持。然后,您可以从单个页面模型继承该模型并将您的页面特定数据存储在那里。

    对我来说运行良好的 MVC 实现通常具有相对干净的控制器。控制器只是连接器,将请求中的数据获取到模型中,然后将准备好的模型传递给正确的视图。

    至于如何在 .Net 中存储事物集合 - 查看实现 IEnumerable interface 的类。特别关注DictionaryList 类。字典对象存储名称/值对,并且可以包含嵌套字典。您几乎可以像在 PHP 中使用多维数组一样使用它们。列表对象只是相同类型的项目的索引集合。您可以像使用 PHP 中的简单数组一样使用它们。

    附带说明 - 如果您刚刚开始使用 .Net 并且具有 PHP/Python 背景,那么如果您可以切换到 C# 可能会更好。您会发现语法更加舒适,教程/示例更加丰富(尤其是在 asp.net mvc 世界中)

    【讨论】:

      【解决方案3】:

      这并不难! :-) 如果布局模型与内容页面类型相同,则自动关联!这是最简单的例子……

      这是一个测试布局:

      @model string
      <style>
      .test
          {
              background:@Model;
          }
      </style>
      <div class="test">
          Ciao
      </div>
      @RenderBody()
      

      这是一个测试内容页面

      @{
          Layout = "~/Views/Shared/_Test.cshtml";
      }
      @model string
      ...blah blah...
      

      只需使用以下内容调用视图:

      ...
      return View("Name", (object)"Green");
      

      它已经完成了!模型在内容页面和布局页面中是一样的! 安德烈亚

      P.S.:相信我!这个有用!!!也许它对纯粹主义者来说不是最好的,但它真的很有用!!! :-)

      【讨论】:

        猜你喜欢
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2011-08-17
        • 1970-01-01
        相关资源
        最近更新 更多