当前位置:Gxlcms > asp.net > Coolite Cool Study 3 MVC + Coolite 的实现代码

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

时间:2021-07-01 10:21:17 帮助过:11人阅读

MVC-Coolite

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

项目文件分布:

ProjectFiles

关于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 的简单封装。

  1. <span class="kwrd">using</span> System;
  2. <span class="kwrd">using</span> System.Collections.Generic;
  3. <span class="kwrd">using</span> System.Linq;
  4. <span class="kwrd">using</span> System.Web;
  5. <span class="kwrd">using</span> System.Web.Mvc;
  6. <span class="kwrd">using</span> Coolite.Ext.Web;
  7. <span class="kwrd">namespace</span> CooliteMVC.Helper
  8. {
  9. <span class="kwrd">public</span> <span class="kwrd">class</span> AjaxStoreResult : ActionResult
  10. {
  11. <span class="kwrd">public</span> AjaxStoreResult() { }
  12. <span class="kwrd">public</span> AjaxStoreResult(<span class="kwrd">object</span> data)
  13. {
  14. <span class="kwrd">this</span>.Data = data;
  15. }
  16. <span class="kwrd">public</span> AjaxStoreResult(<span class="kwrd">object</span> data, <span class="kwrd">int</span> totalCount)
  17. : <span class="kwrd">this</span>(data)
  18. {
  19. <span class="kwrd">this</span>.TotalCount = totalCount;
  20. }
  21. <span class="kwrd">public</span> AjaxStoreResult(StoreResponseFormat responseFormat)
  22. {
  23. <span class="kwrd">this</span>.ResponseFormat = responseFormat;
  24. }
  25. <span class="kwrd">private</span> <span class="kwrd">object</span> data;
  26. <span class="kwrd">public</span> <span class="kwrd">object</span> Data
  27. {
  28. get { <span class="kwrd">return</span> <span class="kwrd">this</span>.data; }
  29. set { <span class="kwrd">this</span>.data = <span class="kwrd">value</span>; }
  30. }
  31. <span class="kwrd">private</span> <span class="kwrd">int</span> totalCount;
  32. <span class="kwrd">public</span> <span class="kwrd">int</span> TotalCount
  33. {
  34. get { <span class="kwrd">return</span> <span class="kwrd">this</span>.totalCount; }
  35. set { <span class="kwrd">this</span>.totalCount = <span class="kwrd">value</span>; }
  36. }
  37. <span class="kwrd">private</span> StoreResponseFormat responseFormat = StoreResponseFormat.Load;
  38. <span class="kwrd">public</span> StoreResponseFormat ResponseFormat
  39. {
  40. get { <span class="kwrd">return</span> <span class="kwrd">this</span>.responseFormat; }
  41. set { <span class="kwrd">this</span>.responseFormat = <span class="kwrd">value</span>; }
  42. }
  43. <span class="kwrd">private</span> SaveStoreResponse saveResponse;
  44. <span class="kwrd">public</span> SaveStoreResponse SaveResponse
  45. {
  46. get
  47. {
  48. <span class="kwrd">if</span> (<span class="kwrd">this</span>.saveResponse == <span class="kwrd">null</span>)
  49. {
  50. <span class="kwrd">this</span>.saveResponse = <span class="kwrd">new</span> SaveStoreResponse();
  51. }
  52. <span class="kwrd">return</span> <span class="kwrd">this</span>.saveResponse;
  53. }
  54. }
  55. <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> ExecuteResult(ControllerContext context)
  56. {
  57. <span class="kwrd">switch</span> (<span class="kwrd">this</span>.ResponseFormat)
  58. {
  59. <span class="kwrd">case</span> StoreResponseFormat.Load:
  60. <span class="kwrd">string</span> json = Coolite.Ext.Web.JSON.Serialize(Data);
  61. json = <span class="str">"{data:"</span> + json + <span class="str">", totalCount:"</span> + 100 + <span class="str">"}"</span>;
  62. context.HttpContext.Response.Write(json);
  63. <span class="kwrd">break</span>;
  64. <span class="kwrd">case</span> StoreResponseFormat.Save:
  65. Response response = <span class="kwrd">new</span> Response(<span class="kwrd">true</span>);
  66. response.Success = <span class="kwrd">this</span>.SaveResponse.Success;
  67. response.Msg = <span class="kwrd">this</span>.SaveResponse.ErrorMessage;
  68. StoreResponseData saveResponse = <span class="kwrd">new</span> StoreResponseData();
  69. saveResponse.Confirmation = <span class="kwrd">this</span>.SaveResponse.ConfirmationList;
  70. response.Data = saveResponse.ToString();
  71. response.Write();
  72. <span class="kwrd">break</span>;
  73. <span class="kwrd">default</span>:
  74. <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentOutOfRangeException();
  75. }
  76. }
  77. }
  78. <span class="kwrd">public</span> <span class="kwrd">enum</span> StoreResponseFormat
  79. {
  80. Load,
  81. Save
  82. }
  83. <span class="kwrd">public</span> <span class="kwrd">class</span> SaveStoreResponse
  84. {
  85. <span class="kwrd">private</span> <span class="kwrd">bool</span> success = <span class="kwrd">true</span>;
  86. <span class="kwrd">private</span> <span class="kwrd">string</span> errorMessage;
  87. <span class="kwrd">public</span> <span class="kwrd">bool</span> Success
  88. {
  89. get { <span class="kwrd">return</span> <span class="kwrd">this</span>.success; }
  90. set { <span class="kwrd">this</span>.success = <span class="kwrd">value</span>; }
  91. }
  92. <span class="kwrd">public</span> <span class="kwrd">string</span> ErrorMessage
  93. {
  94. get { <span class="kwrd">return</span> <span class="kwrd">this</span>.errorMessage; }
  95. set { <span class="kwrd">this</span>.errorMessage = <span class="kwrd">value</span>; }
  96. }
  97. <span class="kwrd">public</span> ConfirmationList ConfirmationList { get; set; }
  98. }
  99. }

AjaxStoreResult 在 CustomerController 中的使用:

  1. <span class="kwrd">using</span> System;
  2. <span class="kwrd">using</span> System.Collections.Generic;
  3. <span class="kwrd">using</span> System.Linq;
  4. <span class="kwrd">using</span> System.Web;
  5. <span class="kwrd">using</span> System.Web.Mvc;
  6. <span class="kwrd">using</span> System.Web.Mvc.Ajax;
  7. <span class="kwrd">using</span> CooliteMVC.Models;
  8. <span class="kwrd">using</span> CooliteMVC.Helper;
  9. <span class="kwrd">using</span> Coolite.Ext.Web;
  10. <span class="kwrd">namespace</span> CooliteMVC.Controllers
  11. {
  12. <span class="kwrd">public</span> <span class="kwrd">class</span> CustomerController : Controller
  13. {
  14. <span class="rem">//</span>
  15. <span class="rem">// GET: /Customer/</span>
  16. <span class="kwrd">public</span> ActionResult Index()
  17. {
  18. ViewData[<span class="str">"Title"</span>] = <span class="str">"Customer List"</span>;
  19. ViewData[<span class="str">"Message"</span>] = <span class="str">"Welcome to Coolite MVC! My name is Bruce."</span>;
  20. <span class="kwrd">return</span> View();
  21. }
  22. <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)
  23. {
  24. Random rand = <span class="kwrd">new</span> Random();
  25. IList<Customer> list = <span class="kwrd">new</span> List<Customer>();
  26. <span class="kwrd">for</span> (<span class="kwrd">int</span> i = start; i < start + limit; i++)
  27. list.Add(<span class="kwrd">new</span> Customer
  28. {
  29. CustomerID = <span class="str">"Customer"</span> + i,
  30. Address = <span class="str">"Address"</span> + i,
  31. City = <span class="str">"City"</span> + rand.Next(1000),
  32. CompanyName = <span class="str">"Com"</span> + rand.Next(1000),
  33. ContactName = <span class="str">"Contract"</span> + rand.Next(1000),
  34. ContactTitle = <span class="str">"Title"</span> + rand.Next(1000),
  35. Country = <span class="str">"Country"</span> + rand.Next(1000),
  36. Email = rand.Next(1000) + <span class="str">"@live.com"</span>,
  37. Fax = rand.Next(1000).ToString() + rand.Next(1000),
  38. Mobile = rand.Next(1000).ToString() + rand.Next(1000),
  39. Notes = <span class="str">"Notes"</span> + rand.Next(1000),
  40. Phone = <span class="str">"Phone"</span> + rand.Next(1000),
  41. Region = <span class="str">"Region"</span> + rand.Next(1000),
  42. TranDate = DateTime.Now.AddDays(rand.Next(30))
  43. });
  44. <span class="kwrd">return</span> <span class="kwrd">new</span> AjaxStoreResult(list, 100);
  45. }
  46. <span class="kwrd">public</span> ActionResult Save()
  47. {
  48. AjaxStoreResult ajaxStoreResult = <span class="kwrd">new</span> AjaxStoreResult(StoreResponseFormat.Save);
  49. <span class="kwrd">try</span>
  50. {
  51. StoreDataHandler dataHandler = <span class="kwrd">new</span> StoreDataHandler(Request[<span class="str">"data"</span>]);
  52. ChangeRecords<Customer> data = dataHandler.ObjectData<Customer>();
  53. <span class="kwrd">foreach</span> (Customer customer <span class="kwrd">in</span> data.Deleted)
  54. {
  55. <span class="rem">//db.Customers.Attach(customer);</span>
  56. <span class="rem">//db.Customers.DeleteOnSubmit(customer);</span>
  57. }
  58. <span class="kwrd">foreach</span> (Customer customer <span class="kwrd">in</span> data.Updated)
  59. {
  60. <span class="rem">//db.Customers.Attach(customer);</span>
  61. <span class="rem">//db.Refresh(RefreshMode.KeepCurrentValues, customer);</span>
  62. }
  63. <span class="kwrd">foreach</span> (Customer customer <span class="kwrd">in</span> data.Created)
  64. {
  65. <span class="rem">//db.Customers.InsertOnSubmit(customer);</span>
  66. }
  67. }
  68. <span class="kwrd">catch</span> (Exception e)
  69. {
  70. ajaxStoreResult.SaveResponse.Success = <span class="kwrd">false</span>;
  71. ajaxStoreResult.SaveResponse.ErrorMessage = e.Message;
  72. }
  73. <span class="kwrd">return</span> ajaxStoreResult;
  74. }
  75. }
  76. }

页面的关键代码:

  1. <ext:Store ID=<span class="str">"dsCustomers"</span> runat=<span class="str">"server"</span> >
  2. <Proxy>
  3. <ext:HttpProxy Url=<span class="str">"/Customer/List"</span> Method =<span class="str">"GET"</span> />
  4. </Proxy>
  5. <UpdateProxy>
  6. <ext:HttpWriteProxy Url=<span class="str">"/Customer/Save"</span> />
  7. </UpdateProxy>
  8. <Reader>
  9. <ext:JsonReader ReaderID=<span class="str">"CustomerID"</span> Root=<span class="str">"data"</span> TotalProperty=<span class="str">"totalCount"</span>>
  10. <Fields>
  11. <ext:RecordField Name=<span class="str">"CustomerID"</span> SortDir=<span class="str">"ASC"</span> />
  12. <ext:RecordField Name=<span class="str">"CompanyName"</span> />
  13. <ext:RecordField Name=<span class="str">"ContactName"</span> />
  14. <ext:RecordField Name=<span class="str">"Email"</span> />
  15. <ext:RecordField Name=<span class="str">"Phone"</span> />
  16. <ext:RecordField Name=<span class="str">"Fax"</span> />
  17. <ext:RecordField Name=<span class="str">"Region"</span> />
  18. <ext:RecordField Name=<span class="str">"TranDate"</span> Type=<span class="str">"Date"</span> />
  19. </Fields>
  20. </ext:JsonReader>
  21. </Reader>
  22. <BaseParams>
  23. <ext:Parameter Name=<span class="str">"limit"</span> Value=<span class="str">"15"</span> Mode=<span class="str">"Raw"</span> />
  24. <ext:Parameter Name=<span class="str">"start"</span> Value=<span class="str">"0"</span> Mode=<span class="str">"Raw"</span> />
  25. <ext:Parameter Name=<span class="str">"dir"</span> Value=<span class="str">"ASC"</span> />
  26. <ext:Parameter Name=<span class="str">"sort"</span> Value=<span class="str">"CustomerID"</span> />
  27. </BaseParams>
  28. <SortInfo Field=<span class="str">"CustomerID"</span> Direction=<span class="str">"ASC"</span> />
  29. </ext:Store>
  1. 我们可以看到其实就是Url的写法不同而已:
  1. <ext:HttpProxy Url=<span class="str">"/Customer/List"</span> Method =<span class="str">"GET"</span> />
  1. <ext:HttpWriteProxy Url=<span class="str">"/Customer/Save"</span> />
  1. 详细页面代码跟第一章差不多,这里不列出来。 <br>

人气教程排行