将数据传递给ASP.NET MVC中的主页面
什么是你的方式传递数据主页(使用ASP.NET MVC),而不会违反MVC规则?
我个人更喜欢编写抽象的控制器(基本控制器)或传递给所有视图的基类。
如果你喜欢你的视图有强types的视图数据类,这可能适合你。 其他解决scheme可能是更正确的,但这是一个很好的平衡devise和实用性恕我直言。
母版页采用一个强types的视图数据类,只包含与其相关的信息:
public class MasterViewData { public ICollection<string> Navigation { get; set; } }
使用该母版页的每个视图都采用包含其信息的强types视图数据类,并从母版页派生视图数据:
public class IndexViewData : MasterViewData { public string Name { get; set; } public float Price { get; set; } }
由于我不希望个别控制器知道将主页数据放在一起的任何事情,我将该逻辑封装到传递给每个控制器的工厂中:
public interface IViewDataFactory { T Create<T>() where T : MasterViewData, new() } public class ProductController : Controller { public ProductController(IViewDataFactory viewDataFactory) ... public ActionResult Index() { var viewData = viewDataFactory.Create<ProductViewData>(); viewData.Name = "My product"; viewData.Price = 9.95; return View("Index", viewData); } }
inheritance匹配主要查看关系,但是当涉及到呈现部分/用户控件时,我将他们的视图数据组成他们的视图数据,例如
public class IndexViewData : MasterViewData { public string Name { get; set; } public float Price { get; set; } public SubViewData SubViewData { get; set; } } <% Html.RenderPartial("Sub", Model.SubViewData); %>
这只是示例代码,并不打算按原样编译。 专为ASP.Net MVC 1.0。
我更喜欢将主视图的数据驱动片断分解成部分,并使用Html.RenderAction来渲染它们。 与stream行的视图模型inheritance方法相比,这有几个明显的优势:
- 主视图数据与“常规”视图模型完全分离。 这是inheritance的组合,并导致一个更松散的耦合系统,更容易改变。
- 主视图模型由完全独立的控制器动作构build。 “定期”行动不需要担心,而且也不需要一个视图数据工厂,这对我的口味来说似乎过于复杂。
- 如果您碰巧使用像AutoMapper这样的工具将您的域映射到您的视图模型,那么您会发现configuration起来更容易,因为您的视图模型在不inheritance主视图数据时更接近于您的域模型。
- 对于主数据使用单独的操作方法,您可以轻松地将输出caching应用于页面的某些区域。 通常情况下,主视图包含的数据更改频率比主页面内容要less。
编辑
通用错误在下面提供了一个更好的答案。 请阅读!
原始答复
微软实际上已经发布了一个“官方”的方式来处理这个问题。 这提供了一个循序渐进的解释他们的推理。
总之,他们推荐使用一个抽象的控制器类,但是自己去看看。
抽象控制器是一个好主意,我还没有find更好的方法。 我很想看看其他人做了什么。
我做了一些研究,发现了这两个网站。 也许他们可以帮忙。
ASP.NET MVC提示#31 – 传递数据到主页和用户控制
使用ASP.NET MVC将数据传递给主页
我发现你传递给视图的所有模型对象的共同父对象是非常有用的。
无论如何,页面之间始终会存在一些常见的模型属性。
Request.Params对象是可变的。 作为请求处理周期的一部分,向它添加标量值非常简单。 从视angular来看,这些信息可能已经在QueryString或FORM POST中提供了。 心连心
我的另一个好方法可能是创build一个像一些接口的一些属性,如父视图的接口,所以你可以使用它需要对页面(父控制)的引用控制和主视图应该从访问观点。
其他解决scheme缺乏优雅,需要很长的时间。 我为几乎整整一年后做这件非常悲伤和贫穷的事情而道歉:
<script runat="server" type="text/C#"> protected override void OnLoad(EventArgs e) { base.OnLoad(e); MasterModel = SiteMasterViewData.Get(this.Context); } protected SiteMasterViewData MasterModel; </script>
很显然,我有SiteMasterViewData这个静态方法Get()返回SiteMasterViewData。