原谅模糊的标题,我不知道如何形容它。

如果您有通用型号“存档”,如何根据用户选择的“类型”显示不同的视图/表单?

例如,用户创建一个新的“存档”,然后选择视频,书籍,音频等。从那里,他们会根据存档类型获得不同的表单。

或者将它们分成不同的模型会更好 - 视频,书籍,音频?

或者模型可以继承(如Video extends Archive)。我想这是基本的OOP /类,但不知道如何应用它。

欢迎来自任何MVC框架的示例!

有帮助吗?

解决方案

好像你不想让类型从Archive继承。 “始终倾向于封装/遏制继承”。

为什么不创建一个名为Archive的类并为其指定一个type属性。该类型可以使用继承来专门用于音频,视频等。

您似乎会根据其他一些标准专门化档案。 " FileSystemArchivce"," XMLArchive"," SQLArchive"而且类型不会改变。但是我的敏捷专家说,起初这可能不是必需的,你可以随时重构设计......

就控制器而言,通过在视图中封装每种类型的表示差异,您可能会获得最大的收益。因此,只有视图会根据类型进行更改。可能每个语义和规则都是相同的,你不需要为每种类型都有单独的控制器。每种类型的视图都不同,因为它具有不同的属性。

其他提示

在任何MVC框架中实际显示不同的视图应该很容易。例如,在Microsoft ASP.NET MVC中,您不仅可以从控制器返回视图,如下所示:

return View();

但实际上会将视图的名称声明为参数:

return View("VideoArchive");

然后会显示Views / Archive / VideoArchive.aspx

中的视图

您的模型视频,书籍和音频可以继承存档。

每个型号都有一个控制器。

http:// yourserver / Books / Edit / 11

在创建相应的模型之前,您必须让用户选择他们想要的存档类型。

编辑(回应评论)

在ASP.NET MVC中,您的模型将是一个类。

public class Video : Archive
{  
    public int Id {get;set}
    public string Name {get;set;}     
    ...
}

您还将拥有一个控制器

public class VideoController : Controller
{
    public object Edit(int id)
    {
        Video myVideo = GetVideo(id);
        return View("Edit", myVideo);
    }
     ...
}

您将在Views目录中看到一个视图,例如包含

的页面
public class Edit : View<Video>
{
    ...
}

如果你有一个

的网址,你可以调用它

http:// localhost / Video / Edit / 11

这一切都是从内存中完成的,所以可能会有一些错误,但是带回家的消息就是你在模型中指定了继承。该模型只是一个类。在您的情况下,您想从Archive继承。一旦你完成了这个,模型就会正常传递。

在我看来,支持MVC的一个重要方面是,如果所有用户需求都是不同的视图,您可能不需要自定义模型(或控制器 - 您只需要一个)。只有存储(持久性)架构决定了它的需要时才会出现多个模型。如果您需要多个模型,某些功能(如数据访问对象(DAO))可能会在控制器和模型之间显示为另一个层。

查看 Apache Struts 项目的示例。正如 Struts for Newbies 中所述,“要好好利用Struts,重要的是要掌握好基础知识。首先,查看关键技术入门,并研究任何不熟悉的主题。“

有关其他资源,请参阅网络层应用程序框架设计(Sun J2EE蓝图)

单一责任原则(PDF)指出:

  

从来不应该只是改变一个阶段的一个原因。

您的存档类通过处理多种不同类型的存档而违反了此原则。例如,如果您需要更新视频存档,则还要修改处理书籍和音频存档的类。

处理此问题的适当方法是为每种不同类型的存档创建单独的类。这些类型应该实现一个公共接口(或继承一个公共基类),以便可以通过仅关注Archives而不是特定存档类型的代码互换(多态)处理它们。

一旦你有了这个类层次结构,你就需要一个控制器和每个模型类的视图。

对于奖励积分,单一责任原则甚至可以证明使用工厂方法或抽象工厂来创建模型,视图和控制器对象(而不是新建内联)。毕竟,创建一个对象并使用该对象是不同的职责,可能需要根据不同的原因进行更改。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top