2009-05-20 31 views
12

Cách tốt nhất để duy trì giá trị chuỗi truy vấn trong asp.net mvc là gì?Làm thế nào để bạn duy trì giá trị chuỗi truy vấn trong asp.net mvc?

Nếu tôi có một url: /câu hỏi page = 2 & sort = mới nhất & mục = 50 & showcomments = 1 & search = abcd

Mở liên kết phân trang tôi muốn giữ những giá trị chuỗi truy vấn trong tất cả các các liên kết để chúng tồn tại khi người dùng nhấp vào "trang tiếp theo" (ví dụ: giá trị trang sẽ thay đổi, nhưng phần còn lại sẽ giữ nguyên)

Tôi có thể nghĩ ra 2 cách sau:

  1. Request.QueryString trong Xem và thêm giá trị cho các liên kết
  2. Vượt qua mỗi giá trị chuỗi truy vấn từ Controller trở lại vào Xem dùng ViewData

Là một tốt hơn so với người kia? Đó có phải là những lựa chọn duy nhất hoặc có cách nào tốt hơn để làm điều này?

Trả lời

6

tôi sẽ xử lý các QueryString trong giao diện (tùy chọn của bạn # 1), thay vì đi qua nó trong từ bộ điều khiển. Cách tiếp cận này làm cho chế độ xem độc lập hơn, cho phép bạn chuyển đổi chế độ xem thành điều khiển chế độ xem và sử dụng lại nó trên các chế độ xem khác nhau.

Lưu ý: Truy cập trực tiếp QueryString trong chế độ xem có vẻ như vi phạm nguyên tắc thiết kế tách Mô hình và Chế độ xem, nhưng trên thực tế, dữ liệu này là mối quan tâm điều hướng có liên quan đến chế độ xem, không thực sự là một phần của mô hình.

+0

Cảm ơn đầu vào và lý luận. Ghi chú của bạn chính xác là lý do tôi nghĩ sẽ chuyển nó qua ViewData. – dtc

1

Tôi chỉ giữ các giá trị trong Phiên theo cách mà các liên kết phân trang chỉ cần có;

/câu hỏi trang? = 2

/trang

câu hỏi? = 3

Các lý do tại sao tôi sẽ không cho chúng tôi các QueryString là bởi vì tôi không muốn người dùng để xem các giá trị mà tôi đang chuyển đến chương trình. Nó làm cho nó quá dễ dàng cho họ để đi vào thanh địa chỉ và bắt đầu thay đổi các giá trị để 'xem những gì sẽ xảy ra'. Với mã này, tất cả những gì họ có thể làm là thay đổi số trang.

+0

Đó là điều tôi đã nghĩ đến trong một giây nhưng muốn giữ nó trong chuỗi truy vấn. – dtc

+0

lý do chính đáng bạn muốn rời khỏi & sort = mới nhất & items = 50 & showcomments = 1 & search = abcd trong chuỗi truy vấn để mọi người có thể đánh dấu tìm kiếm.Có lý do nào khiến bạn không muốn mọi người chỉnh sửa trực tiếp giá trị & search = trong truy vấn và 'xem điều gì xảy ra' không? –

8

tôi sử dụng một phương pháp mở rộng cho rằng:

public static string RouteLinkWithExtraValues(
     this HtmlHelper htmlHelper, 
     string name, 
     object values) 
    { 
     var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values); 

     var extraValues = new RouteValueDictionary(values); 
     foreach (var val in extraValues) 
     { 
      if (!routeValues.ContainsKey(val.Key)) 
       routeValues.Add(val.Key, val.Value); 
      else 
       routeValues[val.Key] = val.Value; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form) 
     { 
      routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key]; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString) 
     { 
      if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "") 
       routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key]; 
     } 

     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name); 
    } 
+0

Tôi chưa bao giờ nghĩ về điều này. Có vẻ thú vị nhưng có lẽ quá phức tạp đối với tôi. Tôi đã hy vọng có một số quy ước MVC thực hiện điều này mà không cần phải viết dòng mã. – dtc

+0

Siêu! : thumbsup: – Haroon

0

Đây là cách tôi thực hiện nó trong Asp.Net Core, đầu tiên gán các tham số chuỗi truy vấn để ViewBags trong điều khiển của bạn:

[HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")] 
public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId) 
{ 
    ViewBag.CategoryId = categoryId; 
    ViewBag.ContractTypeId = contractTypeId; 
    ViewBag.LocationId = locationId; 

    ... 
} 

Sau đó vượt qua các giá trị để liên kết của bạn như sau:

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@teachingCategory.Id" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @teachingCategory.Description (@teachingCategory.Rank) 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@typeOfEmployment.Id" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @typeOfEmployment.Name 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@item.Id"> 
    @item.Id 
</a> 

Lưu ý rằng mọi liên kết giữ giá trị thực tế của riêng nó và chuyển phần còn lại của giá trị tuyến đường qua những gì chúng tôi đã chuyển đến ViewBag.

Các vấn đề liên quan