因为默认的 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 的实现代码的详细内容...