2009-09-16 77 views
6

Tôi đã đọc rất nhiều về vấn đề này, nhưng tôi không thể hiểu được.ASP.NET MVC DropDownList Selected Value Problem

Tôi có danh sách thả xuống trên chế độ xem được sử dụng để phân trang. Bạn chọn trang bạn muốn truy cập và biểu mẫu được gửi. Khi xem được trả lại, trang được yêu cầu được hiển thị. Danh sách thả xuống thay đổi để phản ánh trang mới được hiển thị. Điều này làm việc tốt.

Vấn đề của tôi là: Tôi có 2 nút gửi, một cho trang tiếp theo và một cho trang trước. Trong bộ điều khiển, nếu một trong các lần gửi được nhấn, trang # phải được tăng hoặc giảm đi 1. Điều này đang xảy ra và trang dữ liệu chính xác đang được hiển thị. Tuy nhiên, danh sách thả xuống sẽ không, KHÔNG VẤN ĐỀ GÌ TÔI LÀM, phản ánh số trang mới khi chế độ xem được hiển thị.

Về cơ bản, nếu trình đơn thả xuống được thay đổi bởi người dùng, nó sẽ phản ánh những thay đổi đó khi nó được gửi lại sau khi gửi biểu mẫu. Nếu tôi thay đổi trang # theo chương trình, trình đơn thả xuống sẽ không thay đổi, ngay cả khi trang dữ liệu chính xác được hiển thị.

Dưới đây là phương pháp hành động:

public ActionResult Results(TechSearch search, string NextPage, string PrevPage) 
{ 
    if (NextPage != null) search.Page++; 
    if (PrevPage != null) search.Page--; 

    int resultCount = search.GetResultCount(Desk); 

    List<int> pages = new List<int>(); 
    int pageCount = (int)Math.Ceiling((decimal)resultCount/search.PageSize); 
    for (int i = 1; i <= pageCount; i++) pages.Add(i);   

    ViewData["pages"] = new SelectList(pages, search.Page);    
    ViewData["pageCount"] = pageCount; 

    return View(search); 
} 

Và đây là phần có liên quan của quan điểm:

<input type="submit" value="<" name="PrevPage" /> 
Page 
<%=Html.DropDownList("Page",(SelectList)ViewData["pages"]) %> 
of 
<%=ViewData["pageCount"]%> 
<input type="submit" value=">" name="NextPage" /> 

Xin vui lòng giúp.

EDIT

Trang 333 của Pro ASP.NET MVC Framework by Steven Sanderson:

Làm thế nào điều khiển Input Nhận giá trị của họ

Mỗi [các Helpers HTML cho Rendering Input Controls] cố gắng populate bản thân bằng cách nhìn cho một giá trị ở các địa điểm sau, theo thứ tự này mức độ ưu tiên:

  1. ViewData.ModelState [ "controlName"]. Value.RawValue tham số
  2. giá trị truyền cho phương pháp helper HTML, hoặc nếu bạn đã gọi là tình trạng quá tải mà không bao gồm một tham số giá trị , sau đó ViewData .Eval ("controlName")

ModelState là một khu vực lưu trữ tạm thời rằng ASP.NET MVC sử dụng để duy trì giá trị cố gắng đến cộng ràng buộc và xác nhận lỗi. Lưu ý rằng nằm ở đầu danh sách ưu tiên, để giá trị của nó ghi đè mọi thứ bạn có thể đặt rõ ràng. Công ước này có nghĩa là bạn có thể chuyển một thông số giá trị rõ ràng để hoạt động như giá trị mặc định hoặc giá trị ban đầu của người trợ giúp là ; nhưng khi hiển thị lại chế độ xem sau khi lỗi xác thực , trình trợ giúp sẽ giữ lại mọi giá trị do người dùng nhập trong tùy chọn mặc định đó.

Tôi đã xác minh rằng ViewData.ModelState ["Trang"].RawValue chứa số trang không mong muốn đang làm phiền tôi. Cách tốt nhất để giải quyết vấn đề này là gì?

+1

+1 Sử dụng chuỗi và mô hình ràng buộc thực sự tốt đẹp để thực hiện phân tích cú pháp có thể đọc được trong đó nút gửi được nhấn. –

+0

@Dan - Cảm ơn. Tôi đã chọn nó từ Pro ASP.NET MVC Framework bởi Steven Sanderson trong phần trên Wizards và Multistep Forms (pg 396) –

+1

Cuốn sách của Steven Sanderson rất tốt. – RichardOD

Trả lời

4

Vấn đề là ModelState được giữ DropDownList của truyền về giá trị. Đối với các điều khiển nhập HtmlHelper, ModelState được ưu tiên hơn các giá trị được đặt rõ ràng khi hiển thị một giá trị trong điều khiển đầu vào.

Dưới đây là những gì tôi đã làm trong phương pháp hành động của tôi để sửa chữa các vấn đề:

ModelState.Remove("Page"); 
return View(search); 

Tôi quan tâm đến nghe cách khác để sửa chữa vấn đề của tôi.

+1

Đặt số trang trực tiếp vào mô hình trong hành động thay vì xóa nó. Danh sách bạn chọn sẽ chỉ được tạo ra khỏi danh sách các trang. – Neal

0

Thay đổi giá trị đã chọn bằng javascript khi nhấp vào nút tiếp theo hoặc trước đó, ngay trước khi đăng lại.

+0

Tôi đã làm điều đó trước khi tôi hỏi câu hỏi của tôi và điều đó đã chăm sóc nó, nhưng tại sao nó không hoạt động nếu không? –

+0

Trình duyệt đang lưu vào bộ nhớ cache lựa chọn của người dùng. Bằng cách sử dụng javascript, bạn đang thay đổi lựa chọn người dùng (và do đó ấn tượng của trình duyệt của lựa chọn) trước khi bạn thực hiện postback. Cách khác là đặt giá trị vào tiêu đề trang của bạn chỉ định không có bộ nhớ đệm. Điều đó có thể hoặc có thể không phải là những gì bạn cần mặc dù ... –

+0

Trình duyệt không được lưu vào bộ nhớ cache. Phương thức biểu mẫu là một GET. Điều đó có nghĩa là thông số trang được gửi trong url, điều này làm cho url duy nhất. –

0
  1. Bạn có chắc chắn rằng bạn được đảm bảo rằng ít nhất một trong số NextPage hoặc PrevPage sẽ là rỗng? (Và bạn không nhận được bất kỳ điều gì lạ như String.Empty buộc tăng và giảm?)
  2. Có thể .LastOrDefault() được thay thế bằng chỉ .Last() và bạn chắc chắn rằng bạn không chỉ định default(int) đến search.Page?
+0

1.) Có, tôi chắc chắn. 2.) Dòng mã đó không liên quan đến vấn đề. –

0

Dưới đây có bất kỳ tác dụng nào không?

ViewData["pages"] = new SelectList(pages, 
            pages.FirstOrDefault(p => p == search.Page)); 

Thay

ViewData["pages"] = new SelectList(pages, search.Page); 
+0

Điều đó không có hiệu lực. –

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