关于ASP.NET MVC 2.0 开发记要

一.对某张表内的非空字段,不列举在页面表单上将不做非空验证。

    某表有10个字段,其中5个是必输项(A、B、C、D、E),另5个(a、b、c、d、e)都有默认值(如:CreateTime)。在Models层由VS自动生成的数据模型(或者由部分类中采用MetadataType扩充)得到的各属性(Property),都添加上验证属性(Attribute):对A、B、C、D、E都需要添加 [Required(ErrorMessage = “请输入值”)],而另5个有默认值的属性(Property)则不需添加。因为A、B、C、D、E在数据库是必填项,是一条记录不可或缺的组成基础,故可以认为它们在页面表单上都会被提供操作而进行输入,但a、b、c、d、e往往就无所谓了,表单显示与否对该记录的产生都不会造成影响。有一种业务情景(Scenario)是这样,让A、B、C由用户通过表单输入,而D、E则留给开发者在Controllers层自行控制,解决办法就是在参数上应用Bind属性(Attribute),其中Include表示仅包含对A、B、C的验证:

   1: [HttpPost]
   2: public ActionResult Register(
   3:     [Bind(Include="A、B、C")]
   4:     Member member)
   5: {
   6:     return View();
   7: } 

这样一来,MVC框架将不对D、E作非空验证了,如果采用Exclude,写法与Include倒置:

   1: [HttpPost]
   2: public ActionResult Register(
   3:     [Bind(Exclude="D、E")]
   4:     Member member)
   5: {
   6:     return View();
   7: } 
   8:  

 

二.对现有Models层中由VS自动生成的类进行扩展验证。

1.Member类记得添加 partial关键字;

2.在Member类内部定义一个私有内部类MemberMetadata,对原Models层中的Member类已定义的字段作验证属性(Attribute)扩展;

3.对Member类冠以属性(Attribute):[MetadataType(typeof(MemberMetadata))]

   1: [MetadataType(typeof(MemberMetadata))]
   2: public partial class Member
   3: {        
   4:     partial void OnAccountChanged()
   5:     {
   6:         this._Account = this._Account.ToLowerInvariant();
   7:     }
   8:  
   9:     private class MemberMetadata
  10:     {
  11:         [DisplayName("系统编号")]
  12:         public int ID { get; set; }
  13:  
  14:         [DisplayName("账号")]
  15:         [Required(ErrorMessage = "请输入账号")]
  16:         [StringLength(50, ErrorMessage = "请勿输入超过 50 个字")]
  17:         public string Account { get; set; }
  18:     }
  19: }

 

三.配合用户控件,实现异步无刷新更新记录

1.主页面:生成Form的辅助方式将由HtmlHelper改成AjaxHelper。像HtmlHelper一样,也要指定Action名称,额外需指定更新目标,即Div的id名(CustomerDetails);

确保“事件源”位于AjaxForm内,而受影响区(CustomerDetails)则放哪都可以。而且在AjaxForm内,一个传统的submit提交请求将自动转化为异步回发。

View Code
 1 <h2>
2 Customers</h2>
3 <div>
4 <%using (Ajax.BeginForm("Details", "Home", new AjaxOptions { UpdateTargetId = "CustomerDetails" }))
5 {%>
6 <p>
7 Customer:<%:Html.DropDownList("CustomerID")%></p>
8 <p>
9 <input type="submit" value="Details" /></p>
10 <%} %>
11 </div>
12 <div id="CustomerDetails">
13 </div>

2.先初始化下拉框的值:

View Code
public ActionResult Index()
{
var customers = dbNorthwind.Customers.ToList();
ViewData["CustomerID"] = new SelectList(customers, "CustomerID", "CompanyName");
return View();
}

 

3.用来封装异常加载明细的是一个用户控件(PartialView),他的逻辑相当简单:接受一个CustomerID参数,返回一个部分(子)页面(包含HTML标签和数据),

这个用户控件好在哪呢?以往都是接受一串JSON数据,然后手动拼接DOM,这都是基于JavaScript脚本来写,很痛苦。而他免去了我们在客户端手动拼接HTML标签和数据的苦活,在Controller层,一个 return PartialView("CustomerDetailView", customer)就搞定。

View Code
public ActionResult Details(string CustomerID)
{
Customer customer = dbNorthwind.Customers.FirstOrDefault(c => c.CustomerID == CustomerID);
if (customer != null)
{
return PartialView("CustomerDetailView", customer);
}
return View();
}

 

4.生成一个用户控件,取名叫CustomerDetailView,注意视图数据类(View Data Class)声明为Customer类就可以了:

View Code
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc2_PartialAjax.Models.Customer>" %>

 

 

 

 

 

 

 



 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2011-11-18 11:11  罗霄(Sto)  阅读(291)  评论(0编辑  收藏  举报