gpt4 book ai didi

c# - ASP.NET MVC : Populating Derived Strongly Typed View with Base Strongly Typed View

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:49 26 4
gpt4 key购买 nike

在我的应用程序中,我有不同的页面:联系我们、关于我们、主页

它们都具有需要填充 View 的相同基本元素:

  • 页面标题
  • 元描述
  • 用户信息

但是在每个页面上,它们都有一些不同的元素:

联系我们

  • 联系信息模型
  • 联系表模型

关于我们

  • 扩展用户信息模型

首页

  • 主页文本属性

它们都被路由到相同的 Controller 操作方法,因为除了根据页面类型填充“额外”信息之外,大多数功能都是相似的。

到目前为止,我已经做了一些事情:

PageDetailViewData pageDetailViewData = new PageDetailViewData {Title = title, Desc = desc....}

然后我有:

                switch ((PageType)page.PageType)
{
case (PageType.Contact):
return View("ContactUsDetails", pageDetailViewData);
default:
return View(pageDetailViewData);
}

问题是如何填充“额外”信息?我不确定我是否会以正确的方式进行此操作。任何对更好地构建逻辑流程的见解都将不胜感激。

最佳答案

使用接口(interface)来暗示 View 模型之间的某些共性的答案肯定会有助于回答您问题中的某些要点。

不过,我想问一下,“重构”您的 Action 以支持不同数据结构的多个 View 是多么明智。

MVC Controller 操作通常表示收集生成预期 View 所需的特定数据所需的最少代码量。单个操作返回同一模型数据的不同 View (例如 Html View 或移动 View )并不少见,但是通过改变数据的结构和将生成的 View 会引入一些问题。

特别是您违反了常见的最佳实践,例如 Single Responsibility Principle并使您的代码测试起来更加复杂 - 无痛测试和 TDD 毕竟是 ASP.Net MVC 的巨大胜利的一部分。

我个人会有一个单独的 Action。

就您的 View 模型而言,如果这是一个数据库,您会怎么做?您会对单独的数据进行单独的查询,对吗?

用户的个人资料信息将与页面元数据信息分开查询。这样做的原因有很多,例如能够缓存数据的某些部分但不能缓存其他部分。

根据上述建议,您的代码可能如下所示(警告:此代码不是用 Visual Studio 编写的,可能充满语法问题):

public interface IMetaDataViewModel
{
PageMetaData MetaData{get; set;}
}
public class HomeViewModel : IMetaDataViewModel
{
public PageMetaData MetaData{get; set;}
public string HomePageText{get; set;}
}
//other view models go here....

public class CommonPagesController : Controller
{
private MetaDataProvider _metaProvider = new MetaDataProvider();
private PageDataProvider _pageDataProvider = new PageDataProvider();
private ContactDataProvider _contactDataProvider = new ContactDataProvider();

public ActionResult Home()
{
var viewModel = new HomeViewModel
{
MetaData = _metaProvider.GetPageMeta();
HomePageText = _pageDataProvider.GetPageData();
};
return View(viewModel);
}
public ActionResult Contact()
{
var viewModel = new ContactViewModel
{
MetaData = _metaProvider.GetPageMeta();
ContactFormData = _contactDataProvider.GetData();
};
return View(viewModel);
}
//you get the picture...
}

您还可以通过多种方式重构 View 模型代码的生成,但这是一种可能的模式。

我很欣赏这个答案确实有一定的意见,但我会考虑采取单独的行动是最佳做法。

希望对您有所帮助。

关于c# - ASP.NET MVC : Populating Derived Strongly Typed View with Base Strongly Typed View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com