1

原谅这个模糊的标题,我不知道如何描述它。

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

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

还是将它们分成不同的模型会更好——视频、书籍、音频?

或者模型可以继承(如视频扩展存档)。我想这是基本的 OOP / 类,但不知道如何在这里应用它。

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

4

5 回答 5

3

您的模型 Video、Book 和 Audio 可以从 Archive 继承。

每个模型都会有一个控制器。

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>
{
    ...
}

所以如果你有一个 URL,你可以调用它

http://localhost/视频/编辑/11

这一切都是从记忆中完成的,因此可能会有一些错误,但带回家的信息是您在模型中指定了继承。模型只是一个类。在您的情况下,您想从存档继承。完成后,模型将正常传递。

于 2008-09-24T19:23:59.570 回答
3

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

return View();

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

return View("VideoArchive");

然后将显示来自 Views/Archive/VideoArchive.aspx 的视图

于 2008-09-24T19:31:42.903 回答
3

似乎您不想让类型从存档继承。“总是倾向于封装/包含而不是继承”。

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

看起来您会根据其他一些标准专门化存档。“FileSystemArchivce”、“XMLArchive”、“SQLArchive”和类型不会改变。但是我的敏捷主义者说,一开始这可能不是必需的,你以后总是可以重构设计......

就控制器而言,通过封装视图中每种类型的表示差异,您可能会获得最大的收益。所以只有视图会根据类型而变化。每个类型的语义和规则很可能是相同的,并且您不需要为每种类型设置单独的控制器。每种类型的视图都不同,因为它具有不同的属性。

于 2008-09-24T19:40:59.607 回答
1

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

改变班级的理由不应该不止一个。

您的 Archive 类通过处理多种不同类型的档案违反了这一原则。例如,如果您需要更新视频存档,那么您也在修改处理书籍和音频存档的类。

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

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

对于加分点,单一职责原则甚至可以证明使用工厂方法或抽象工厂来创建模型、视图和控制器对象(而不是内联新建它们)是合理的。毕竟,创建对象和使用该对象是不同的职责,可能出于不同的原因需要对其进行更改。

于 2008-09-25T05:28:29.803 回答
0

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

查看Apache Struts项目中的示例。正如Struts for Newbies中所述,“要很好地使用 Struts,重要的是要很好地掌握基础知识。从复习关键技术入门书开始,并研究任何不熟悉的主题。”

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

于 2008-09-24T19:31:36.040 回答