热门标签 | 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


推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
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社区 版权所有