相信很多人刚接触EF+MVC的时候,会有这个疑问,就是当我们在model类中加验证信息的时候,会在重新生成model的时候被重写掉。这里介绍一个方法:
比如我有个Employee类是从数据库中生成到model中的,我们可以在Models文件夹中创建一个部分类名称与Employee类同名,然后在新建的部分类中加上我们需要验证信息,这时我们在view页面中引用Models.Employee做为页面model类。这样当我们重新生成model的时候,我们自己定义的部分类Employee就不会受影响了。
下面是样例代码:
从数据库中生成的Employee:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ValidationDemo
{
using System;
using System.Collections.Generic;
public partial class Employee
{
public Employee()
{
this.Employees1 = new HashSet<Employee>();
this.Orders = new HashSet<Order>();
this.Territories = new HashSet<Territory>();
}
public int EmployeeID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Title { get; set; }
public string TitleOfCourtesy { get; set; }
public Nullable<System.DateTime> BirthDate { get; set; }
public Nullable<System.DateTime> HireDate { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }
public string HomePhone { get; set; }
public string Extension { get; set; }
public byte[] Photo { get; set; }
public string Notes { get; set; }
public Nullable<int> ReportsTo { get; set; }
public string PhotoPath { get; set; }
public Nullable<int> COL1 { get; set; }
public virtual ICollection<Employee> Employees1 { get; set; }
public virtual Employee Employee1 { get; set; }
public virtual ICollection<Order> Orders { get; set; }
public virtual ICollection<Territory> Territories { get; set; }
}
}
创建一个部分类,命名为Employee:using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace ValidationDemo.Models
{
public partial class Employee
{
public int EmployeeID { get; set; }
[Required]//There is my dataAnnotation
public string LastName { get; set; }
public string FirstName { get; set; }
public string Title { get; set; }
public string TitleOfCourtesy { get; set; }
public Nullable<System.DateTime> BirthDate { get; set; }
public Nullable<System.DateTime> HireDate { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }
public string HomePhone { get; set; }
public string Extension { get; set; }
public byte[] Photo { get; set; }
public string Notes { get; set; }
public Nullable<int> ReportsTo { get; set; }
public string PhotoPath { get; set; }
public Nullable<int> COL1 { get; set; }
}
}@model ValidationDemo.Models.Employee
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Employee</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.FirstName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.TitleOfCourtesy, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.TitleOfCourtesy)
@Html.ValidationMessageFor(model => model.TitleOfCourtesy)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.BirthDate, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.BirthDate)
@Html.ValidationMessageFor(model => model.BirthDate)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.HireDate, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.HireDate)
@Html.ValidationMessageFor(model => model.HireDate)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address)
@Html.ValidationMessageFor(model => model.Address)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.City, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.City)
@Html.ValidationMessageFor(model => model.City)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Region, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Region)
@Html.ValidationMessageFor(model => model.Region)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.PostalCode, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.PostalCode)
@Html.ValidationMessageFor(model => model.PostalCode)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Country, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Country)
@Html.ValidationMessageFor(model => model.Country)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.HomePhone, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.HomePhone)
@Html.ValidationMessageFor(model => model.HomePhone)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Extension, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Extension)
@Html.ValidationMessageFor(model => model.Extension)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Photo, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Photo)
@Html.ValidationMessageFor(model => model.Photo)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Notes, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Notes)
@Html.ValidationMessageFor(model => model.Notes)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ReportsTo, "ReportsTo", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("ReportsTo", String.Empty)
@Html.ValidationMessageFor(model => model.ReportsTo)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.PhotoPath, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.PhotoPath)
@Html.ValidationMessageFor(model => model.PhotoPath)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.COL1, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.COL1)
@Html.ValidationMessageFor(model => model.COL1)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
最后,我们需要将名为Create的Action将Models下的Employee类的实例作为参数传入:[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,BirthDate,HireDate,Address,City,Region,PostalCode,Country,HomePhone,Extension,Photo,Notes,ReportsTo,PhotoPath,COL1")] Employee employee)
{
if (ModelState.IsValid)
{
db.Employees.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ReportsTo = new SelectList(db.Employees, "EmployeeID", "LastName", employee.ReportsTo);
return View(employee);
}如何避免在EF自动生成的model中的DataAnnotation被覆盖掉,布布扣,bubuko.com
如何避免在EF自动生成的model中的DataAnnotation被覆盖掉
原文:http://blog.csdn.net/mx5721/article/details/25702091