好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Coolite Cool Study 3 MVC + Coolite 的实现代码


因为默认的 MVC 的样式文件里对于的 table 和 其他相关样式(h1~h6) 与Coolite有冲突,会导致GridPanel走样,大家记得先把那个table 和  h1~h6的样式清除掉才看到GridPanel的帅脸面 …

项目文件分布:

关于Coolite在MVC中的配置文件跟一般webform是一样的。 但在MVC的Global.asax中,需要在 RegisterRoutes 方法里加上这一句:

routes.IgnoreRoute("{exclude}/{coolite}/coolite.axd");

另外 ScriptManager 要注明 IDMode="Static“:

<ext:ScriptManager ID="ScriptManager1" runat="server"  IDMode="Static"/>

其中唯一与一般MVC不同的是,我们需要定义自己的ActionResult来返回Json结果给客户端。因为Coolite 的JsonReader 要求的格式大致都是这样:{data: [{…}], totalCount: …}

关于JsonReader的一般用法:

<ext:JsonReader ReaderID="CustomerID" Root=" data " TotalProperty=" totalCount "> 

所以, 要继承MVC ActionResult 的抽象方法 public override void ExecuteResult(ControllerContext context)  来返回给 JsonReader   合适口味 的 JsonResult , 不然它就不认人了。

以下代码实现了对Json Response & Save Response 的简单封装。

 using  System;
 using  System.Collections.Generic;
 using  System.Linq;
 using  System.Web;
 using  System.Web.Mvc;
 using  Coolite.Ext.Web;

 namespace  CooliteMVC.Helper
{ 
   public   class  AjaxStoreResult : ActionResult
  {
     public  AjaxStoreResult() { }

     public  AjaxStoreResult( object  data)
    {
       this .Data = data;
    }

     public  AjaxStoreResult( object  data,  int  totalCount)
      :  this (data)
    {
       this .TotalCount = totalCount;
    }

     public  AjaxStoreResult(StoreResponseFormat responseFormat)
    {
       this .ResponseFormat = responseFormat;
    }

     private   object  data;
     public   object  Data
    {
      get {  return   this .data; }
      set {  this .data =  value ; }
    }

     private   int  totalCount;
     public   int  TotalCount
    {
      get {  return   this .totalCount; }
      set {  this .totalCount =  value ; }
    }

     private  StoreResponseFormat responseFormat = StoreResponseFormat.Load;
     public  StoreResponseFormat ResponseFormat
    {
      get {  return   this .responseFormat; }
      set {  this .responseFormat =  value ; }
    }

     private  SaveStoreResponse saveResponse;
     public  SaveStoreResponse SaveResponse
    {
      get
      {
         if  ( this .saveResponse ==  null )
        {
           this .saveResponse =  new  SaveStoreResponse();
        }
         return   this .saveResponse;
      }
    }

     public   override   void  ExecuteResult(ControllerContext context)
    {
       switch  ( this .ResponseFormat)
      {
         case  StoreResponseFormat.Load:

           string  json = Coolite.Ext.Web.JSON.Serialize(Data);
          json =  "{data:"  + json +  ", totalCount:"  + 100 +  "}" ;
          context.HttpContext.Response.Write(json);
           
           break ;
         case  StoreResponseFormat.Save:
          Response response =  new  Response( true );
          response.Success =  this .SaveResponse.Success;
          response.Msg =  this .SaveResponse.ErrorMessage;
          StoreResponseData saveResponse =  new  StoreResponseData();
          saveResponse.Confirmation =  this .SaveResponse.ConfirmationList;
          response.Data = saveResponse.ToString();

          response.Write();
           break ;
         default :
           throw   new  ArgumentOutOfRangeException();
      }
    }
 
  }

   public   enum  StoreResponseFormat
  {
    Load,
    Save
  }

   public   class  SaveStoreResponse
  {
     private   bool  success =  true ;
     private   string  errorMessage;

     public   bool  Success
    {
      get {  return   this .success; }
      set {  this .success =  value ; }
    }

     public   string  ErrorMessage
    {
      get {  return   this .errorMessage; }
      set {  this .errorMessage =  value ; }
    }

     public  ConfirmationList ConfirmationList { get; set; }
  }
}
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

AjaxStoreResult 在 CustomerController 中的使用:

 using  System;
 using  System.Collections.Generic;
 using  System.Linq;
 using  System.Web;
 using  System.Web.Mvc;
 using  System.Web.Mvc.Ajax;
 using  CooliteMVC.Models;
 using  CooliteMVC.Helper;
 using  Coolite.Ext.Web;

 namespace  CooliteMVC.Controllers
{
   public   class  CustomerController : Controller
  {
     // 
     // GET: /Customer/ 

     public  ActionResult Index()
    {
      ViewData[ "Title" ] =  "Customer List" ;
      ViewData[ "Message" ] =  "Welcome to Coolite MVC! My name is Bruce." ;
       return  View();
    }

     public  ActionResult List( int  limit,  int  start,  string  dir,  string  sort)
    {
      Random rand =  new  Random();
      IList<Customer> list =  new  List<Customer>();
       for  ( int  i = start; i < start + limit; i++)
        list.Add( new  Customer
        {
          CustomerID =  "Customer"  + i,
          Address =  "Address"  + i,
          City =  "City"  + rand.Next(1000),
          CompanyName =  "Com"  + rand.Next(1000),
          ContactName =  "Contract"  + rand.Next(1000),
          ContactTitle =  "Title"  + rand.Next(1000),
          Country =  "Country"  + rand.Next(1000),
          Email = rand.Next(1000) +  "@live测试数据" ,
          Fax = rand.Next(1000).ToString() + rand.Next(1000),
          Mobile = rand.Next(1000).ToString() + rand.Next(1000),
          Notes =  "Notes"  + rand.Next(1000),
          Phone =  "Phone"  + rand.Next(1000),
          Region =  "Region"  + rand.Next(1000),
          TranDate = DateTime.Now.AddDays(rand.Next(30))
        });
       return   new  AjaxStoreResult(list, 100);
    }

     public  ActionResult Save()
    {
      AjaxStoreResult ajaxStoreResult =  new  AjaxStoreResult(StoreResponseFormat.Save);
       try 
      {
        StoreDataHandler dataHandler =  new  StoreDataHandler(Request[ "data" ]);
        ChangeRecords<Customer> data = dataHandler.ObjectData<Customer>();

         foreach  (Customer customer  in  data.Deleted)
        {
           //db.Customers.Attach(customer); 
           //db.Customers.DeleteOnSubmit(customer); 
        }
         foreach  (Customer customer  in  data.Updated)
        {
           //db.Customers.Attach(customer); 
           //db.Refresh(RefreshMode.KeepCurrentValues, customer); 
        }
         foreach  (Customer customer  in  data.Created)
        {
           //db.Customers.InsertOnSubmit(customer); 
        }
      }
       catch  (Exception e)
      {
        ajaxStoreResult.SaveResponse.Success =  false ;
        ajaxStoreResult.SaveResponse.ErrorMessage = e.Message;
      }
       return  ajaxStoreResult;
    }
 
  }
}
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

页面的关键代码:

   <ext:Store ID= "dsCustomers"  runat= "server"  >
    <Proxy>
      <ext:HttpProxy Url= "/Customer/List"  Method = "GET"  />
    </Proxy>
    <UpdateProxy>
       <ext:HttpWriteProxy Url= "/Customer/Save"  />
    </UpdateProxy>
    <Reader>
      <ext:JsonReader ReaderID= "CustomerID"  Root= "data"  TotalProperty= "totalCount" >
        <Fields>
          <ext:RecordField Name= "CustomerID"  SortDir= "ASC"  />
          <ext:RecordField Name= "CompanyName"  />
          <ext:RecordField Name= "ContactName"  />
          <ext:RecordField Name= "Email"  />
          <ext:RecordField Name= "Phone"  />
          <ext:RecordField Name= "Fax"  />
          <ext:RecordField Name= "Region"  />
          <ext:RecordField Name= "TranDate"  Type= "Date"  />
        </Fields>
      </ext:JsonReader>
    </Reader>
    <BaseParams>
      <ext:Parameter Name= "limit"  Value= "15"  Mode= "Raw"  />
      <ext:Parameter Name= "start"  Value= "0"  Mode= "Raw"  />
      <ext:Parameter Name= "dir"  Value= "ASC"  />
      <ext:Parameter Name= "sort"  Value= "CustomerID"  />
    </BaseParams>
    <SortInfo Field= "CustomerID"  Direction= "ASC"  />
  </ext:Store>
我们可以看到其实就是Url的写法不同而已:
 <ext:HttpProxy Url= "/Customer/List"  Method = "GET"  />
 <ext:HttpWriteProxy Url= "/Customer/Save"  /> 
详细页面代码跟第一章差不多,这里不列出来。 

查看更多关于Coolite Cool Study 3 MVC + Coolite 的实现代码的详细内容...

  阅读:53次