Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC:使用基本强类型视图填充派生的强类型视图_C#_Asp.net Mvc - Fatal编程技术网

C# ASP.NET MVC:使用基本强类型视图填充派生的强类型视图

C# ASP.NET MVC:使用基本强类型视图填充派生的强类型视图,c#,asp.net-mvc,C#,Asp.net Mvc,在我的应用程序中,我有不同的页面:联系我们、关于我们、主页 它们都具有填充视图所需的相同基本元素: 页面标题 元描述 用户信息 但是,在每个页面上,它们都有一些不同的元素: 联系我们 联系信息模型 接触形式模型 关于我们 扩展用户信息模型 家 主页文本属性 它们都被路由到相同的控制器操作方法,因为除了填充依赖于页面类型的“额外”信息之外,大多数功能都是类似的 到目前为止,我在以下方面做了一些工作: PageDetailViewData pageDetailViewData = n

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

它们都具有填充视图所需的相同基本元素:

  • 页面标题
  • 元描述
  • 用户信息
但是,在每个页面上,它们都有一些不同的元素:

联系我们

  • 联系信息模型
  • 接触形式模型
关于我们

  • 扩展用户信息模型

  • 主页文本属性
它们都被路由到相同的控制器操作方法,因为除了填充依赖于页面类型的“额外”信息之外,大多数功能都是类似的

到目前为止,我在以下方面做了一些工作:

PageDetailViewData pageDetailViewData = new PageDetailViewData {Title = title, Desc = desc....}
接下来我有:

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

问题是如何填充“额外”信息?我不确定我是否会用正确的方法来做这件事。如果您能深入了解逻辑流程的结构,我们将不胜感激。

您问题的标题几乎能为您提供答案。您可以使用某种形式的多态性来实现这一点。您可以定义具有共享属性的基类,也可以定义如下所示的接口:

public interface ICommonPage
{
    string Title { get; }
    string MetaDescription { get; }
    string UserInformation { get; }
}
然后定义三个强类型ViewModel类,所有这些类都实现此接口(或从基类派生):

  • ContactUsViewModel:ICommonPage
  • 关于ViewModel:ICommonPage
  • HomeViewModel:ICommonPage
在每个ViewModel类上,添加这些视图所需的额外属性

在控制器操作中,需要打开PageType以选择正确的ViewModel并用数据填充它

您还需要创建三个不同的视图(.aspx),它们强类型化到每个ViewModel类


如果您对公共数据进行了共享呈现,则可以将其提取到强类型用户控件(.ascx)中,该控件键入到ICommonPage。

您的问题的标题几乎给出了答案。您可以使用某种形式的多态性来实现这一点。您可以定义具有共享属性的基类,也可以定义如下所示的接口:

public interface ICommonPage
{
    string Title { get; }
    string MetaDescription { get; }
    string UserInformation { get; }
}
然后定义三个强类型ViewModel类,所有这些类都实现此接口(或从基类派生):

  • ContactUsViewModel:ICommonPage
  • 关于ViewModel:ICommonPage
  • HomeViewModel:ICommonPage
在每个ViewModel类上,添加这些视图所需的额外属性

在控制器操作中,需要打开PageType以选择正确的ViewModel并用数据填充它

您还需要创建三个不同的视图(.aspx),它们强类型化到每个ViewModel类


如果您对公共数据进行了共享呈现,则可以将其提取到强类型用户控件(.ascx)中,该控件被键入到ICommonPage。

使用接口暗示视图模型之间的某些公共性的答案肯定有助于回答您问题中的一些要点

然而,我想问,“重构”您的操作以支持不同数据结构的多个视图有多明智

MVC控制器操作通常表示收集生成预期视图所需的特定数据所需的最小代码量。单个操作返回同一模型数据的不同视图(例如Html视图或移动视图)并非完全不常见,但通过改变生成的数据和视图的结构,会带来一些问题

特别是,您违反了常见的最佳实践,如,并使代码的测试变得更加复杂,而无痛苦的测试和TDD毕竟是ASP.NETMVC取得巨大成功的一部分

就我个人而言,我会有一个单独的行动

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

用户的配置文件信息将与页面元数据信息分开查询。这样做的原因有很多,例如,可以缓存数据的某些部分,但不能缓存其他部分

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

还有几种方法可以重构视图模型代码的生成,但这是一种可能的模式

我很感激这个答案确实有一定的意见,但是我会考虑采取单独的行动来做最好的练习。
希望这会有所帮助。

使用界面来暗示视图模型之间的某些共性的答案肯定会有助于回答问题中的一些要点

然而,我想问,“重构”您的操作以支持不同数据结构的多个视图有多明智

MVC控制器操作通常表示收集生成预期视图所需的特定数据所需的最小代码量。单个操作返回同一模型数据的不同视图(例如Html视图或移动视图)并非完全不常见,但通过改变生成的数据和视图的结构,会带来一些问题

特别是,您违反了常见的最佳实践,如,并使代码的测试变得更加复杂,而无痛苦的测试和TDD毕竟是ASP.NETMVC取得巨大成功的一部分

就我个人而言,我会有一个单独的行动

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

用户的配置文件信息将与页面元数据信息分开查询。这样做的原因很多