65.9K
CodeProject 正在变化。 阅读更多。
Home

MVC.NET 3.00 版的 MVC PLUS

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (4投票s)

2011 年 4 月 30 日

CC (ASA 3U)

7分钟阅读

viewsIcon

35444

WebLights 组件库

注意:这个框架是一个与 J2EE 中 SPRING 的标准 MVC 和 MVC.NET 3.00 具有 100% 兼容性的框架,它在它们之上运行,并添加了许多以前在这个领域不存在的功能。

引言

我一直不喜欢 Webforms,因为它的代码质量低,而且缺乏 Web 特性。此外,我喜欢 C#,但由于这个平台缺乏 MVC 架构,我转向了 JAVA,我们正在讨论的它的库也有一个 JAVA (SPRING 的 MVC) 组件库,但我想介绍 C# 和 MVC.NET 版本作为我最喜欢的产品。

此设计的目标是

  1. Web 中的应用程序式环境
  2. 制作一个真正的以数据库为中心的系统,减少表单手动编码的工作量
  3. 轻量且高质量的页面
  4. 切勿使用 IFramePopup 窗口,因为它们的行为不佳(我通过 JavaScript 沙盒实现了这一点,这意味着:您加载的所有表单都将加载到同一个 DOM 区域,并且它们将显示在一个 DIV 中,而不是 IFRAME 中)
  5. 以及许多其他目标:最重要的是一种新的标准开发方式,特别是喜欢使用元模型(META MODELS)而非模型(Models),因为元模型具有更强的概念。

这个系统是

  • 100% 纯 Ajax
  • 完全无需刷新(我再次重申,无需刷新,但您可以重定向,不过也完全无需刷新页面)
  • 页面加载速度提高多达 5 倍
  • 这是第一次
    • 组件模型中实现了 JavaScript 沙盒支持(完全不需要 Iframe!)
    • 100% 以数据库为中心的系统

完成工作后进行比较。

我们出于相同的原因编写了相同的代码,并在三个不同的平台上进行了测试。您可以在这里看到结果

如您所见,MVC PLUS 在开发上所需时间仅为 MVC.NET 的三分之一,WebForms 的不到一半,这意味着更低的成本、更高质量的代码,以及在代码质量和整体上更便宜、更好的产品。

在这里,我们比较了这些框架的渲染大小,这也意味着服务器端渲染时间更短,如果您使用 SSL(应用服务器成本更低,数据传输速度更快),这将非常有效。

如您所见,使用 MVC Plus 渲染的平均表单大小介于 5 到 10 KB 之间,这远小于其他竞争对手,甚至小于 MVC.NET 中使用 Telerik 组件的它们的一半。

注意:所有测试都在我朋友的办公室通过,稍后我将发布示例代码(这些是真实的商业产品,所以我的朋友可能会删减一些代码)。

请注意,所有测试都是针对视图、原因和场景中相似的表单设计进行的。

标准 MVC 3.00

在标准 MVC 中,您必须按如下方式编写模型

public class Person{
  public string name {get ; set ; }
  public string FamilyName {get ; set ; }
}
public class ADDRESS{
  public string name {get ; set ; }
  public string FamilyName {get ; set ; }
}

每个视图最多只能支持一个模型,例如,您只能访问 Person 模型或 Address 模型。

在 MVC PLUS 中

在 MVC Plus 中,您必须将模型与元模型分开声明,元模型将用于控制器和视图

首先,编写您的模型(作为存储库或 DAL)

public class Person:WLBaseModel {
  [PrimaryKey]
  public int PersonID;
  [stringLength (max:50)]
  [REQUIRED]
  public string name {get ; set ; }
  [REQUIRED]
  [stringLength (max:50)]
  public string FamilyName {get ; set ; }
}
public class ADDRESS:WLBaseModel {
  [PrimaryKey]
  public int addrssID {get ; set ;}
  [ForeignKey(Person)]
  public int PersonID {get ; set ;}
  [REQUIRED]
  [stringLength (max:50)]
  public string City {get ; set ; }
  [REQUIRED]
  [stringLength (max:65535)]
  public string Address {get ; set ; }
}

然后您必须按如下方式声明您的 元模型

public class MetaModel :WLBaseMetaModel
{
  [ApplicationServerCache { timeOut:10}]
  public Person Person{get ; set ;}
  [ApplicationServerCache { timeOut:10}]
  public Address Address {get ; set ;}
}

在标准 MVC 3.00 中,您无法同时访问这两个模型。在 MVC PLUS 和元模型中,您可以在一个元模型中拥有多个模型。

视图

我们目前仅支持 MVC.NET 3.00 中的 RAZOR,因此,其他视图引擎暂不支持,我们认为以后也不会支持。

您可以按如下方式在视图中使用您声明的 元模型

@Html.WLControlFor(m=>m.Person.Name)
@Html.WLControlFor(m=>m.Person.FamilyName)
@Html.WLControlFor(m=>m.Address.City)
@Html.WLControlFor(m=>m.Address.Addrsss)

所有模型成员将相互连接:网格、树、编辑器、复选框、组合框等。我再次强调,您必须将模型和元模型的概念彼此分开。

在这里,您可以看到我上面所说内容的含义

如您所见,树和编辑器相互连接。

但是它是如何工作的呢?简而言之,我们有一个这样的架构。它是一个复杂的架构,但我们只做了一次,以确保安全的开发方式

稍后,我将介绍在繁重的 JavaScript 和 C# 库中实现这种代码有多么困难(主要是在架构方面,这是一个很难完成的任务)。

请注意,这是一个庞大而优秀的 WEB 架构,也许是第一次?(我不知道!只是也许。)我们做了几件新事情来提供这些能力。

批量数据传输

在标准 MVC 中,数据传输只能传输单条记录,而对于多条记录,您需要编写大量的自定义代码。

在大多数情况下,如果您想向/从服务器传输多条记录,开发起来会很困难。

在 MVC 中,您可以一次发送/接收多条记录,我们可以将其称为批量传输。这对于大多数开发情况都很有用。

作为架构中的额外优势,MVC Plus 在客户端和服务器端都具有双向(服务器/客户端)缓存,这将保证

  • 您将只收到一条记录或数据一次。
  • 您将只收到需要在客户端显示的所需记录。

您可以将模型行为设置为“实时”。

由于数据在客户端发生变化,并且您在客户端更改光标位置或修改客户端数据,客户端会将更新、插入或删除的项目发送到服务器。

Address.LiveData = true;

您可以将模型行为设置为“离线”。

您可以批量发送记录,例如一次向服务器发送 10 条修改过的记录。

Person.LiveData = false;

为了处理批量或单条记录,您有以下触发器:

  • 插入前 (Beforeinsert)
  • 更新前 (BeforeUpdate)
  • 选择前 (BeforeSelect)
  • BeforeDelete
  • BeforeChange
  • 其他命令前 (BeforeOtherCommands)

而且你还有

  • 插入后 (Afterinsert)
  • 更新后 (AfterUpdate)
  • 选择后 (AfterSelect)
  • AfterDelete
  • AfterChange
  • 其他命令后 (AfterOtherCommands)

主/从

在 MVC Plus 中,您可以将模型作为主从关系在元模型中可用,但不用担心,无需编写太多代码——您只需用几行代码即可完成。您可以如下将两个模型连接为主从关系

Address.Master = Person;

[AutoConnectModels(“*”)]
public class MetaModel {
             … {Models …
}

无需额外代码。

自动操作所需的數據將通過模型屬性上的屬性提供

[PrimaryKey]
public int addrssID {get ; set ;}
[ForeignKey(Person)]
public int PersonID {get ; set ;}

验证

验证将显示在控件旁边,客户端将在发送到应用服务器之前显示一条消息。

验证与标准 MVC 非常相似,但您可以拥有

  1. 行验证 (RowValidation)
  2. 字段验证 (FieldValidation)

大多数情况下不需要进行 RowValidation,但您也可以将其添加到客户端和服务器端。

默认情况下,大多数验证将自动完成。

一个示例代码如下

[Required]
[RangeOf(OnlyAlphabet)]
[MaxMinLength(5,50)]
public string  Name {get ; set ;}

甚至

[Required]
[Password(StrongPassord)]
[MaxMinLength(5,32)]
[EqualTo(“confirmPassword”]
Public string Password {get ; set ; }

此外,系统将自动在客户端和服务器端验证模型成员的类型。

验证将显示在控件旁边,客户端将在发送到应用服务器之前显示一条消息。您可以轻松地为它们设置特殊的形状,但默认情况下,我们有四种不同的显示方式

  1. 发布前作为模态(DIV 模态,而非弹出窗口!)
  2. 在您输入时,作为工具提示显示在左上角
  3. 自定义方式
  4. 在编辑控件的左侧或右侧空间

Components

每个单独的控件都应有一个 FieldName,类似于应用服务器中 ModelProperty 名称,这些将由 C# 或 J2EE 组件自动生成。

只需将您的控件简单地放在视图中即可

@Html.WLControlFor(m=>m.Address.Addrsss) 

我们为这个框架准备了许多组件

  • Html.WLTextEditFor
  • Html.WLWebEditorFor
  • Html.WLDivEditFor
  • Html.WLDisplayfor
  • Html.WLTreefor
  • Html.WLCheckBoxFor
  • Html.WLComboBoxFor
  • Html.WLSpinEditFor
  • Html.WLAutoCompleteFor
  • Html.WLLookUpFor
  • Html.WLGridFor

以及其他 109 多个即用型组件。

在图片中,您可以看到一些页面是用这个系统设计的。请注意,这些标签页不是 IFRAMES,它们来自不同的来源,并且使用了 JAVASCRIPT 沙盒模型,您始终可以从服务器端运行任何 JS 命令而无需刷新。

MVC PLUS 2.00 现在支持以前不存在的 TREE 模型

  • 树模型有两种方式,手动或自动,它们都使用递归模型。无需任何特殊代码
  • 只需在模型中启用树属性
    Model.IsTree=True;
  • 然后在视图中

    @Html.WLTreeFor(m=>m.Person)

Ryan Samiee

BCs 和 16 年专业经验(从 14 岁开始作为专业开发人员与公司合作),以及 14 年 Delphi 和随后的 WEB 组件开发经验。

© . All rights reserved.