2010-10-28 28 views
1

我有一個頁面,我有一個控制網格的下拉列表。對於這個網格我使用MVCContrib。 當我改變我的dropdownlist的值,控制器的HttpPost方法被調用,這工作正常。 但是,當我頁面或排序網格時,始終調用HttpGet方法。爲什麼?這當然不是它應該如何? 現在在下面的代碼中我考慮到了這一點,我有一些工作。但是代碼是很好的,特別是Session的使用。必須有更好的方式來處理這個問題? 控制器代碼是;MVCContrib網格:分頁和排序執行控制器的HttpGet方法。爲什麼?

[HttpGet] 
[Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
public ActionResult ListHistory(GridSortOptions sort, int? page) 
{ 
    EmployeeListViewModel employees = null; 
    if (sort.Column == null && page.HasValue == false) 
    { 
     employees = new EmployeeListViewModel(EmployeeExtended.GetAllFormerEmployees(), 1); 
     Session["EmployeeListViewModel"] = employees; 
    } 
    else 
    { 
     employees = Session["EmployeeListViewModel"] as EmployeeListViewModel; 
    } 

    if (sort.Column != null) 
    { 
     employees.EmployeeList = employees.EmployeeList.OrderBy(sort.Column, sort.Direction); 
    } 
    int pageLength = Convert.ToInt32(ConfigurationManager.AppSettings["EmployeeListPageLength"].ToString()); 
    employees.EmployeeList = employees.EmployeeList.AsPagination(page ?? 1, pageLength); 
    ViewData["sort"] = new GridSortOptions(); 
    return View(employees); 
} 

[HttpPost] 
[Authorize(Roles = "Administrator, AdminAccounts, ManagerAccounts")] 
public ActionResult ListHistory(GridSortOptions sort, EmployeeListViewModel elvm, int? page) 
{ 
    IEnumerable<EmployeeExtended> employees = null; 

    switch (elvm.OptionsId) 
    { 
     case 1: employees = EmployeeExtended.GetAllFormerEmployees(); 
      break; 
     case 2: employees = EmployeeExtended.GetAllOnNoticeEmployees(); 
      break; 
     case 3: employees = EmployeeExtended.GetAllCurrentEmployees(); 
      break; 
    } 

    if (sort.Column != null) 
    { 
     employees = employees.OrderBy(sort.Column, sort.Direction); 
    } 
    int pageLength = Convert.ToInt32(ConfigurationManager.AppSettings["EmployeeListPageLength"].ToString()); 
    employees = employees.AsPagination(page ?? 1, pageLength); 
    ViewData["sort"] = sort; 
    EmployeeListViewModel elvm1 = new EmployeeListViewModel(employees, elvm.OptionsId); 
    Session["EmployeeListViewModel"] = elvm1; 
    return View(elvm1); 
} 

查看代碼是;

<% using (Html.BeginForm()) 
    {%> 
    <%: Html.AntiForgeryToken() %> 
<fieldset> 
    <legend>List of Employees</legend> 
    <% if (ViewData["LastPersonMessage"] != null && ViewData["LastPersonMessage"].ToString().Length > 0) 
     { %> 
     <p class="error"> 
      At <% Response.Write(DateTime.Now.ToString("T")); %>. <%: ViewData["LastPersonMessage"]%>. 
     </p> 
    <%} %> 
    <p>Click on history to view the history of an employee.</p> 
    <p>Select which employees you want to see: 
     <%:Html.DropDownListFor(model => model.OptionsId, Model.Options, new { onchange = "this.form.submit();" })%> 
    </p> 
    <%: Html.Grid(Model.EmployeeList).Columns(column => 
    { 
     column.For(model => Html.ActionLink("History", "ShowHistory", new { employeeId = model.EmployeeId })).Named("").DoNotEncode(); 
     column.For(model => model.Forename); 
     column.For(model => model.Surname); 
     column.For(model => model.DivisionName); 
     column.For(model => model.DepartmentName); 
     column.For(model => model.StartDate).Format("{0:d}"); 
     column.For(model => model.EndDate).Format("{0:d}"); 
    }).Sort((GridSortOptions)ViewData["sort"])%> 
    <p><%= Html.Pager((IPagination)Model.EmployeeList)%></p> 
    <p></p> 
</fieldset> 
<% } %> 

回答

0

我沒有經歷過你的代碼,但從概念上講,你觀察到的是它應該如何。即:

如果您的操作無意更改您的應用程序中的數據,那麼使用GET就是正確的Http動詞。

POST是操作更改數據時的正確動詞。因爲你只是改變你的數據頁面,或者只是對它進行排序,那麼數據本身不會改變,只是顯示,所以一個帖子會是錯誤的。

所以,隨着歌曲的發展,你「一定做得對」。

相關問題