热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

削除MVC中“添加”和“编辑”的重复代码

用MVC做信息管理系统的时候,通常会遇到“添加”和“编辑”,例如,添加一个用户,编辑一个用户,添加用户的时候,需要验证用户名没有被使用,而编辑一个用户的时候则不需要这个验证。除了这个之外,别的字段的验

用MVC做信息管理系统的时候,通常会遇到“添加”和“编辑”,例如,添加一个用户,编辑一个用户,添加用户的时候,需要验证用户名没有被使用,而编辑一个用户的时候则不需要这个验证。除了这个之外,别的字段的验证都基本没什么差别,例如用户生日啊,地址啊,其它乱七八糟的描述之类。如果我们为此创建了两个Model(一个AddUser,一个EditUser),两个View的话(一个AddUser一个EditUser),就会产生大量重复代码。关于重复代码的危害,我在此就不多说了。

立即想到的解决方法是创建一个UserBase的基类,里面是AddUser和EditUser的共同内容,AddUser和EditUser都从UserBase派生下来,这样能削除掉Model的重复代码,但是View的重复代码怎么办呢?一样还是得创建两个View啊,作为强类型的View,不能同时是AddUser和EditUser的。

关于怎么做,我在asp.net发了一个帖子问: http://forums.asp.net/t/1799937.aspx/1?Help+how+to+avoid+repeated+code+

我也考虑了很多方法,最后敲定了下面这个方法,也许别的方法也行,但我下面提供的这个方法副作用最小。

一个Model:

    public class User
    {
        private const string NOT_NULL = "不可为空";
        private const string USERNAME_REGULAR = "用户名必须由字母、数字或下划线组成,3-20个字符";

        //------The model type condition ------
        public string ModelType { get; set; } //"add" or "edit"

        //-----------Add------------
        [RequiredIf("ModelType", "add", ErrorMessage = NOT_NULL)]
        [RegularExpression(@"^[0-9a-zA-Z_]{3,20}$", ErrorMessage = USERNAME_REGULAR)]
        [Remote("ValidateUserName","Home",ErrorMessage="用户已经存在")]
        public string UserName_Add{get;set;}

        //-----------Edit-----------
        [RequiredIf("ModelType", "edit", ErrorMessage = NOT_NULL)]
        [RegularExpression(@"^[0-9a-zA-Z_]{3,20}$", ErrorMessage = USERNAME_REGULAR)]
        public string UserName_Edit { get; set; }

        //----------Comm data-------
        [Range(1, 100)]
        public int Age { get; set; }

        public string Descriptions { get; set; }
    }

一个View:

@model MvcCombinedCode.Models.User

@{
    ViewBag.Title = "AddUser";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm())
{
    @Html.HiddenFor(model=>model.ModelType)
    if (Model.ModelType == "add")
    {
    
增加新用户
输入用户名
@Html.TextBoxFor(model => model.UserName_Add) @Html.ValidationMessageFor(model => model.UserName_Add)
} else {
编辑用户
当前用户
@Model.UserName_Edit @Html.HiddenFor(model => model.UserName_Edit)
}
年龄
@Html.TextBoxFor(model => model.Age) @Html.ValidationMessageFor(model => model.Age)
描述
@Html.TextAreaFor(model => model.Descriptions)
"submit" />
}

大家已经注意到Model上的[RequiredIf]标签了,这是条件需求,例如“[RequiredIf("ModelType", "add", ErrorMessage = NOT_NULL)]”的意思是:当“ModelType”等于“add”的时候,UserName_Add才“不可为空”,如果UserName_Add为空,那么就不需要其它验证了。关于RequiredIf,大家可以到参考这篇文章:

http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

我直接使用了它提供的代码。下面是我写的demo,VS2010+MVC3调试通过。

http://files.cnblogs.com/guogangj/MvcCombinedCode.7z


推荐阅读
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • 本文介绍了 JSON Schema 和 XML Schema 的基本概念,并详细讲解了如何使用 AJV 进行 JSON 数据校验。通过具体的示例和扩展方法,帮助读者更好地理解和应用这些工具。 ... [详细]
  • 在项目需要国际化处理时,即支持多种语言切换的功能,通常有两种方案:单个包和多个包。本文将重点讨论单个包的实现方法。 ... [详细]
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
  • hdu4539郑厂长系列故事——排兵布阵http:acm.hdu.edu.cnshowproblem.php?pid4539问题描述:给你一个n行m列的0-1矩阵,0表示不 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
author-avatar
1個穷小子_969
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有