时间:2021-07-01 10:21:17 帮助过:11人阅读
因为默认的 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 的简单封装。
- <span class="kwrd">using</span> System;
- <span class="kwrd">using</span> System.Collections.Generic;
- <span class="kwrd">using</span> System.Linq;
- <span class="kwrd">using</span> System.Web;
- <span class="kwrd">using</span> System.Web.Mvc;
- <span class="kwrd">using</span> Coolite.Ext.Web;
- <span class="kwrd">namespace</span> CooliteMVC.Helper
- {
- <span class="kwrd">public</span> <span class="kwrd">class</span> AjaxStoreResult : ActionResult
- {
- <span class="kwrd">public</span> AjaxStoreResult() { }
- <span class="kwrd">public</span> AjaxStoreResult(<span class="kwrd">object</span> data)
- {
- <span class="kwrd">this</span>.Data = data;
- }
- <span class="kwrd">public</span> AjaxStoreResult(<span class="kwrd">object</span> data, <span class="kwrd">int</span> totalCount)
- : <span class="kwrd">this</span>(data)
- {
- <span class="kwrd">this</span>.TotalCount = totalCount;
- }
- <span class="kwrd">public</span> AjaxStoreResult(StoreResponseFormat responseFormat)
- {
- <span class="kwrd">this</span>.ResponseFormat = responseFormat;
- }
- <span class="kwrd">private</span> <span class="kwrd">object</span> data;
- <span class="kwrd">public</span> <span class="kwrd">object</span> Data
- {
- get { <span class="kwrd">return</span> <span class="kwrd">this</span>.data; }
- set { <span class="kwrd">this</span>.data = <span class="kwrd">value</span>; }
- }
- <span class="kwrd">private</span> <span class="kwrd">int</span> totalCount;
- <span class="kwrd">public</span> <span class="kwrd">int</span> TotalCount
- {
- get { <span class="kwrd">return</span> <span class="kwrd">this</span>.totalCount; }
- set { <span class="kwrd">this</span>.totalCount = <span class="kwrd">value</span>; }
- }
- <span class="kwrd">private</span> StoreResponseFormat responseFormat = StoreResponseFormat.Load;
- <span class="kwrd">public</span> StoreResponseFormat ResponseFormat
- {
- get { <span class="kwrd">return</span> <span class="kwrd">this</span>.responseFormat; }
- set { <span class="kwrd">this</span>.responseFormat = <span class="kwrd">value</span>; }
- }
- <span class="kwrd">private</span> SaveStoreResponse saveResponse;
- <span class="kwrd">public</span> SaveStoreResponse SaveResponse
- {
- get
- {
- <span class="kwrd">if</span> (<span class="kwrd">this</span>.saveResponse == <span class="kwrd">null</span>)
- {
- <span class="kwrd">this</span>.saveResponse = <span class="kwrd">new</span> SaveStoreResponse();
- }
- <span class="kwrd">return</span> <span class="kwrd">this</span>.saveResponse;
- }
- }
- <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> ExecuteResult(ControllerContext context)
- {
- <span class="kwrd">switch</span> (<span class="kwrd">this</span>.ResponseFormat)
- {
- <span class="kwrd">case</span> StoreResponseFormat.Load:
- <span class="kwrd">string</span> json = Coolite.Ext.Web.JSON.Serialize(Data);
- json = <span class="str">"{data:"</span> + json + <span class="str">", totalCount:"</span> + 100 + <span class="str">"}"</span>;
- context.HttpContext.Response.Write(json);
- <span class="kwrd">break</span>;
- <span class="kwrd">case</span> StoreResponseFormat.Save:
- Response response = <span class="kwrd">new</span> Response(<span class="kwrd">true</span>);
- response.Success = <span class="kwrd">this</span>.SaveResponse.Success;
- response.Msg = <span class="kwrd">this</span>.SaveResponse.ErrorMessage;
- StoreResponseData saveResponse = <span class="kwrd">new</span> StoreResponseData();
- saveResponse.Confirmation = <span class="kwrd">this</span>.SaveResponse.ConfirmationList;
- response.Data = saveResponse.ToString();
- response.Write();
- <span class="kwrd">break</span>;
- <span class="kwrd">default</span>:
- <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentOutOfRangeException();
- }
- }
- }
- <span class="kwrd">public</span> <span class="kwrd">enum</span> StoreResponseFormat
- {
- Load,
- Save
- }
- <span class="kwrd">public</span> <span class="kwrd">class</span> SaveStoreResponse
- {
- <span class="kwrd">private</span> <span class="kwrd">bool</span> success = <span class="kwrd">true</span>;
- <span class="kwrd">private</span> <span class="kwrd">string</span> errorMessage;
- <span class="kwrd">public</span> <span class="kwrd">bool</span> Success
- {
- get { <span class="kwrd">return</span> <span class="kwrd">this</span>.success; }
- set { <span class="kwrd">this</span>.success = <span class="kwrd">value</span>; }
- }
- <span class="kwrd">public</span> <span class="kwrd">string</span> ErrorMessage
- {
- get { <span class="kwrd">return</span> <span class="kwrd">this</span>.errorMessage; }
- set { <span class="kwrd">this</span>.errorMessage = <span class="kwrd">value</span>; }
- }
- <span class="kwrd">public</span> ConfirmationList ConfirmationList { get; set; }
- }
- }
AjaxStoreResult 在 CustomerController 中的使用:
- <span class="kwrd">using</span> System;
- <span class="kwrd">using</span> System.Collections.Generic;
- <span class="kwrd">using</span> System.Linq;
- <span class="kwrd">using</span> System.Web;
- <span class="kwrd">using</span> System.Web.Mvc;
- <span class="kwrd">using</span> System.Web.Mvc.Ajax;
- <span class="kwrd">using</span> CooliteMVC.Models;
- <span class="kwrd">using</span> CooliteMVC.Helper;
- <span class="kwrd">using</span> Coolite.Ext.Web;
- <span class="kwrd">namespace</span> CooliteMVC.Controllers
- {
- <span class="kwrd">public</span> <span class="kwrd">class</span> CustomerController : Controller
- {
- <span class="rem">//</span>
- <span class="rem">// GET: /Customer/</span>
- <span class="kwrd">public</span> ActionResult Index()
- {
- ViewData[<span class="str">"Title"</span>] = <span class="str">"Customer List"</span>;
- ViewData[<span class="str">"Message"</span>] = <span class="str">"Welcome to Coolite MVC! My name is Bruce."</span>;
- <span class="kwrd">return</span> View();
- }
- <span class="kwrd">public</span> ActionResult List(<span class="kwrd">int</span> limit, <span class="kwrd">int</span> start, <span class="kwrd">string</span> dir, <span class="kwrd">string</span> sort)
- {
- Random rand = <span class="kwrd">new</span> Random();
- IList<Customer> list = <span class="kwrd">new</span> List<Customer>();
- <span class="kwrd">for</span> (<span class="kwrd">int</span> i = start; i < start + limit; i++)
- list.Add(<span class="kwrd">new</span> Customer
- {
- CustomerID = <span class="str">"Customer"</span> + i,
- Address = <span class="str">"Address"</span> + i,
- City = <span class="str">"City"</span> + rand.Next(1000),
- CompanyName = <span class="str">"Com"</span> + rand.Next(1000),
- ContactName = <span class="str">"Contract"</span> + rand.Next(1000),
- ContactTitle = <span class="str">"Title"</span> + rand.Next(1000),
- Country = <span class="str">"Country"</span> + rand.Next(1000),
- Email = rand.Next(1000) + <span class="str">"@live.com"</span>,
- Fax = rand.Next(1000).ToString() + rand.Next(1000),
- Mobile = rand.Next(1000).ToString() + rand.Next(1000),
- Notes = <span class="str">"Notes"</span> + rand.Next(1000),
- Phone = <span class="str">"Phone"</span> + rand.Next(1000),
- Region = <span class="str">"Region"</span> + rand.Next(1000),
- TranDate = DateTime.Now.AddDays(rand.Next(30))
- });
- <span class="kwrd">return</span> <span class="kwrd">new</span> AjaxStoreResult(list, 100);
- }
- <span class="kwrd">public</span> ActionResult Save()
- {
- AjaxStoreResult ajaxStoreResult = <span class="kwrd">new</span> AjaxStoreResult(StoreResponseFormat.Save);
- <span class="kwrd">try</span>
- {
- StoreDataHandler dataHandler = <span class="kwrd">new</span> StoreDataHandler(Request[<span class="str">"data"</span>]);
- ChangeRecords<Customer> data = dataHandler.ObjectData<Customer>();
- <span class="kwrd">foreach</span> (Customer customer <span class="kwrd">in</span> data.Deleted)
- {
- <span class="rem">//db.Customers.Attach(customer);</span>
- <span class="rem">//db.Customers.DeleteOnSubmit(customer);</span>
- }
- <span class="kwrd">foreach</span> (Customer customer <span class="kwrd">in</span> data.Updated)
- {
- <span class="rem">//db.Customers.Attach(customer);</span>
- <span class="rem">//db.Refresh(RefreshMode.KeepCurrentValues, customer);</span>
- }
- <span class="kwrd">foreach</span> (Customer customer <span class="kwrd">in</span> data.Created)
- {
- <span class="rem">//db.Customers.InsertOnSubmit(customer);</span>
- }
- }
- <span class="kwrd">catch</span> (Exception e)
- {
- ajaxStoreResult.SaveResponse.Success = <span class="kwrd">false</span>;
- ajaxStoreResult.SaveResponse.ErrorMessage = e.Message;
- }
- <span class="kwrd">return</span> ajaxStoreResult;
- }
- }
- }
页面的关键代码:
- <ext:Store ID=<span class="str">"dsCustomers"</span> runat=<span class="str">"server"</span> >
- <Proxy>
- <ext:HttpProxy Url=<span class="str">"/Customer/List"</span> Method =<span class="str">"GET"</span> />
- </Proxy>
- <UpdateProxy>
- <ext:HttpWriteProxy Url=<span class="str">"/Customer/Save"</span> />
- </UpdateProxy>
- <Reader>
- <ext:JsonReader ReaderID=<span class="str">"CustomerID"</span> Root=<span class="str">"data"</span> TotalProperty=<span class="str">"totalCount"</span>>
- <Fields>
- <ext:RecordField Name=<span class="str">"CustomerID"</span> SortDir=<span class="str">"ASC"</span> />
- <ext:RecordField Name=<span class="str">"CompanyName"</span> />
- <ext:RecordField Name=<span class="str">"ContactName"</span> />
- <ext:RecordField Name=<span class="str">"Email"</span> />
- <ext:RecordField Name=<span class="str">"Phone"</span> />
- <ext:RecordField Name=<span class="str">"Fax"</span> />
- <ext:RecordField Name=<span class="str">"Region"</span> />
- <ext:RecordField Name=<span class="str">"TranDate"</span> Type=<span class="str">"Date"</span> />
- </Fields>
- </ext:JsonReader>
- </Reader>
- <BaseParams>
- <ext:Parameter Name=<span class="str">"limit"</span> Value=<span class="str">"15"</span> Mode=<span class="str">"Raw"</span> />
- <ext:Parameter Name=<span class="str">"start"</span> Value=<span class="str">"0"</span> Mode=<span class="str">"Raw"</span> />
- <ext:Parameter Name=<span class="str">"dir"</span> Value=<span class="str">"ASC"</span> />
- <ext:Parameter Name=<span class="str">"sort"</span> Value=<span class="str">"CustomerID"</span> />
- </BaseParams>
- <SortInfo Field=<span class="str">"CustomerID"</span> Direction=<span class="str">"ASC"</span> />
- </ext:Store>
- 我们可以看到其实就是Url的写法不同而已:
- <ext:HttpProxy Url=<span class="str">"/Customer/List"</span> Method =<span class="str">"GET"</span> />
- <ext:HttpWriteProxy Url=<span class="str">"/Customer/Save"</span> />
- 详细页面代码跟第一章差不多,这里不列出来。 <br>