zoukankan      html  css  js  c++  java
  • 关于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>" %>



     


     

  • 相关阅读:
    Mysql一些复杂的语句
    Tomcat部署记事
    [转]Java中的事务
    Junit单元测试笔记
    Mysql之执行计划
    当产品部署出现问题时
    CSS之绝对定位那些事
    CSS之浮动那些事
    Tomcat一些小事
    NEC的学习笔记
  • 原文地址:https://www.cnblogs.com/luoxiaonet/p/2253767.html
Copyright © 2011-2022 走看看