2011-01-10 78 views
2

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

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剃须刀(VB)?

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

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

这里是我所拍摄的内容摘要:

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

请原谅这里,和那里的这个post ...我试图弄清楚它是在一个新的(Razor)和新的(ASP.Net MVC)平台上完成的“正确的方式”。

一般建议非常欢迎!

回答

1

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

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

+0

感谢您核实和澄清。 – gahooa 2011-01-14 15:01:38

1

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

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

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

一边注意 - 如果您是刚在.Net和从PHP/Python的背景的开始,它可能会更好,如果你可以切换到C#。你会发现语法更舒适和教程/例子更丰富(尤其是在asp.net mvc的世界)

0

这并不难! :-) 如果布局模型是同一类型的内容页面的,该协会是自动的!这是最简单的例子...

这是一个测试布局:

@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:相信我!这很有用!也许它不是纯粹主义者的最佳选择,但它确实很有用! :-)

相关问题