假设我们有这样一张用户表:

public class F_users
{
[Key]
[Display(Name="用户名:")]
[Required(ErrorMessage="用户名不能为空")]
//[Remote("UserIsExist","Login",ErrorMessage="该用户名已经被占用",HttpMethod="post")]
public virtual string UserName { get; set; } [Display(Name = "密码:")]
[ScaffoldColumn(false)]
[Required(ErrorMessage = "密码不能为空")]
[DataType(DataType.Password)]
[StringLength(, ErrorMessage = "密码长度不能小于3位", MinimumLength = )]
public virtual string PassWord { get; set; } [Display(Name = "确认密码:")]
[Required(ErrorMessage = "确认密码不能为空")]
[HiddenInput(DisplayValue = false)]
[Compare("PassWord", ErrorMessage = "两次密码必须一致")]
public virtual string RepPassword { get; set; } [Display(Name = "密码提示问题:")]
[Required(ErrorMessage = "密码提示问题不能为空")]
public virtual int questionID
{
get;
set;
}
[Display(Name = "密码提示答案:")]
[Required(ErrorMessage = "密码提示答案不能为空")]
public virtual string Answer
{
get;
set;
}
[Display(Name = "注册日期:")]
[DisplayFormat(DataFormatString = "{0:yyyy年MM月dd日}")]
public virtual System.DateTime RegDate
{
get;
set;
}
[Display(Name = "上次登录日期:")]
[DisplayFormat(DataFormatString = "{0:yyyy年MM月dd日}")]
public virtual Nullable<System.DateTime> LastLoginTime
{
get;
set;
}
[Display(Name = "此次登录日期:")]
[DisplayFormat(DataFormatString = "{0:yyyy年MM月dd日}")]
public virtual Nullable<System.DateTime> LonginTime
{
get;
set;
}
[Display(Name = "登录次数:")]
public virtual int LonginCount
{
get;
set;
}
。。。。。。。。。。。
。。。。。。。。。。
后面还有更多的字段,如邮箱号、手机号、QQ号等。

这样的表格相当复杂,字段也是非常的多。但对这张表格的操作,有些时候只是对部分字段进行操作,而不是全部字段。比如修改邮箱号、修改手机号、修改密码等,找回密码等。

就拿修改密码来说,是一种部分更新,但是在更新的时候,所有Required的字段都得满足条件,验证才能通过,否则ModelState.IsValid将永远是false。有些同学是通过Hidder控件来隐藏不需要在页面上显示的字段,从而通过验证,这样非常麻烦,而且非常不安全。

因此,  这篇文章我拿修改密码举例,说明一下如何利用ViewModel实现多字段实体的部分更新。

一、根据视图需求创建ViewModel

public class ChangPwdModel
{
[Display(Name = "新密码:")]
[ScaffoldColumn(false)]
[Required(ErrorMessage = "新密码不能为空")]
[DataType(DataType.Password)]
[StringLength(, ErrorMessage = "密码长度不能小于3位", MinimumLength = )]
public virtual string PassWord { get; set; } [Display(Name = "确认新密码:")]
[Required(ErrorMessage = "确认新密码不能为空")]
[HiddenInput(DisplayValue = false)]
[Compare("PassWord", ErrorMessage = "两次密码必须一致")]
public virtual string RepPassword { get; set; } public int ChangePwd(string id)
{
Entities db = new Entities();
F_users fu = db.F_users.Find(id);
fu.PassWord = this.PassWord;
fu.RepPassword = this.RepPassword;
return db.SaveChanges();
}
}

注意,有些同学认为有了ViewModel,是不是实体对应的model就不需要了?照样还是需要的,一个表格实体对应一个model,这是基础,无论什么地方都是需要的。ViewModel是建立在model的基础之上的。

二、我们先创建修改密码的视图

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>修改密码</legend> <label>原密码:</label><input type="password" name="oldpwd" />
@Html.ValidationMessage("oldpwd")
<br />
@Html.LabelFor(m=>Model.PassWord)
@Html.PasswordFor(m=>Model.PassWord)
@Html.ValidationMessageFor(m=>m.PassWord)
<br />
@Html.LabelFor(m=>Model.RepPassword)
@Html.PasswordFor(m => Model.RepPassword)
@Html.ValidationMessageFor(m => m.RepPassword) <p>
<input type="submit" value="修改" />
</p>
</fieldset>
}

三、根据视图创建控制器

//修改密码
public ActionResult ChangePassword()
{
return View(); }
[HttpPost]
public ActionResult ChangePassword(ChangPwdModel cp)
{
string usn = HttpContext.User.Identity.Name;
if (ModelState.IsValid)
{
string oldPwd = Request.Form["oldpwd"];
int n = (from c in db.F_users where c.UserName == usn && c.PassWord == oldPwd select c).Count();
if (n != )
{
ModelState.AddModelError("oldpwd", "原密码错误");
return View();
} else
{
cp.ChangePwd(usn);
FormsAuthentication.SignOut();
return RedirectToAction("login", "login");
}
}
else
{
ModelState.AddModelError("", "验证没有通过,请修改相应信息后重新提交");
return View();
} }

ViewModel在MVC3中的应用:实现多字段表格的部分更新的更多相关文章

  1. ViewModel在MVC3中的应用:一个view显示多个model

    在mvc3中,默认是一张数据表对应一个model,一个视图 view只显示一个model. 但是有些时候,我们一个视图上可能需要显示多个model的内容,即一个网页可能要展示多张表的信息,那怎么办呢, ...

  2. 在cxf中使用配置避免增加字段导致客户端必须更新、同步实体属性的问题

    在使用cxf实现webservice时,经常碰到的问题就是如果在服务端,修改了一个接口的签名实现,如增加一个字段,或者删除一个字段.在这种情况下,在默认的配置中,就会报以下的错误信息: org.apa ...

  3. ASP.NET MVC3中Controller与View之间的数据传递总结

    一.  Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...

  4. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  5. MVC3中如何输出富文本

    MVC3中如何输出富文本 在网站的文本输出中,经常会将DB里的文本输出到页面上. 一般来说是直接利用MVC3中的ViewBag将文本带到前台并表示, 或是是直接以<%:model.data%&g ...

  6. MVC3中,在control里面三种Html代码输出形式

    MVC3中,在control里面三种Html代码输出形式:ViewData["msg"] = "<br /> Title <br />" ...

  7. MVC3中 ViewBag、ViewData和TempData的使用和区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  8. MVC3+中 ViewBag、ViewData和TempData的使用和区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  9. MVC3中Action返回类型ActionResult类型

    MVC3中Action返回类型ActionResult在System.Web.Mvc命名空间中.这些包含在控制器中的方法,我们称为控制器中的 Action,比如:HomeController 中的 I ...

随机推荐

  1. BZOJ3251 : 树上三角形

    BZOJ AC1000题纪念~~~ 将x到y路径上的点权从小到大排序 如果不存在b[i]使得b[i]+b[i+1]>b[i+2]则无解 此时b数列增长速度快于斐波那契数列,当达到50项时就会超过 ...

  2. Android 并行自动化测试系统 实现总结

    一:    总体架构 系统工程架构源码:https://github.com/UDLD/UIAUTOMATORTEST 整个系统基于: UiAutomator + 自编Python交互库 + Robo ...

  3. c++ stack 的使用

    (1) stack::empty bool empty ( ) const; 判断是否为空. return Value : true if the container size is 0, false ...

  4. easyui datagrid分页要点总结

    easyui的datagird插件比较好用,也很方便.网上也有很多热的网友贴出了使用代码,但是很少有网友指出在使用过程应该注意的地方,让我实在搞不清分页应该怎么使用.我就说下使用分页功能中要注意的一个 ...

  5. hdu 最大报销额

    本题也是一个背包的问题,我觉得这道题的核心就是根据精确度将浮点型转化为整型然后利用动态规划进行求解,注意对题意的理解,有3种支票是不能够报销的. 我开始照着这个思路进行思考,但是敲出来的第一个代码居然 ...

  6. Linux 随笔1

    使用fork()系统调用产生的子进程对父进程中数据的修改不会影响到父进程,因为fork()采用的是写时复制机制,就是在fork产生的子进程没有修改父进程的值时,父子进程共享同一块内存,包括栈区.当子进 ...

  7. 在Windows2003上安装Active Directory Management Gateway Service

    为了让基于Windows2003的域控能够被Powershell管理,必须安装KB968934,但是直接安装会报以下的错误,必须先安装NDP35SP1-KB969166.但是"因为基于 Wi ...

  8. Java集合之Map接口

    Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashM ...

  9. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. Jquery&JS简单选项卡

    结果,如图 为了明显,用绿色+红色 第一步:静态布局 先写html代码和css样式 要点一:  ul li都为块级元素,可以用height,但是里面字体不居中,我们用line-height,即达到居中 ...