2012-07-03 28 views
5

Tôi có một hộp kết hợp trên một ứng dụng MVC3. Khi một mục mới được chọn, nó sẽ gửi lại bài đăng như tôi muốn. Tất cả đều ổn. Trong quá trình tôi bật trong một chuỗi truy vấn và đọc nó trên tải trang. Khi trang làm mới nó đọc chuỗi truy vấn và đặt các điều khiển khác nếu cần.Làm cách nào để phát hiện xem trang của tôi có phải là kết quả của một postback

Tuy nhiên, tôi cần phải phát hiện khi trang tải lại, do trang tải lại, ngược lại với lần tải trang đầu tiên. Điều này là do khi trang tải ban đầu, mọi thứ sẽ bị rối tung cho đến khi ai đó chọn thứ gì đó từ combobox.

Tuy nhiên, người dùng mới vào trang web sẽ không biết điều đó và sẽ chỉ thấy một mớ hỗn độn.

Tôi hiểu rằng các ứng dụng MVC3 không có cùng isPostback như ASP.Net và vì nhiều lý do mà tôi không hiểu, tôi biết nó bằng cách nào đó không được coi là "accaptable".

Tuy nhiên, tôi chỉ muốn biết nếu có một cách đáng tin cậy được đảm bảo 100% để phân biệt giữa lần tải trang đầu tiên và đăng lại theo cách tương tự như đã được thực hiện trong ASP.Net. Nếu có một cách như vậy, nó là gì và làm thế nào tôi có thể thực hiện nó.

Tôi đã thấy bài khác mà làm điều này:

public bool IsPostBack 
    { 
     get 
     { 
      return ViewBag.IsPostBack = (Request.HttpMethod == "POST"); 
     } 
    } 

nhưng tôi đọc những nơi khác rằng đây là luôn luôn đúng. Vì vậy, nếu điều này luôn luôn đúng, nó sẽ là đúng trên tải đầu tiên quá và trong như vậy, tôi không thể nói một cách đáng tin cậy nếu nó là một postback hay không. Tôi biết tất nhiên nó là một postback của một số loại. Nhưng nó không phải là nếu nó là một tải đầu tiên.

Bất kỳ ai cũng có thể giúp tôi trả lời câu hỏi này. Ngoài ra tôi đang sử dụng công cụ xem Razor như trái ngược với các công cụ xem aspx tiêu chuẩn.

+0

không có 'bài đăng trở lại' trong asp.net mvc –

+0

Sẽ rất thú vị khi xem cách bạn đang mã hóa Tác vụ của mình. Cách phổ biến nhất để phát hiện điều này là: GET là lần đầu tiên yêu cầu (nghĩa là, không phải là một postback) và POST, rõ ràng, sẽ là một postback –

+0

Bạn vẫn đang nghĩ về ứng dụng trong kiến ​​trúc webforms. Đây là Bad ™. Bạn nên kiểm tra một số hướng dẫn MVC3. – Tyrsius

Trả lời

14

Trong MVC, bạn thường có những hành động khác nhau cho GET và POST:

[HttpGet] // Actions are GET by default, so you can omit this 
public ActionResult YourAction(int id) 
{ 
    // GET 
} 

[HttpPost] 
public ActionResult YourAction(YourModel model) 
{ 
    // POST 
} 

Nếu bạn làm theo mẫu này, không cần phải lo lắng về tài sản Page.IsPostBack.

+0

Thực ra, điều này có ý nghĩa! Trong vài tháng qua, tôi vừa xóa các thuộc tính này vì nhiều mã được lặp lại ở 2 vị trí. Cảm ơn lời giải thích. Trong tính tỉ mỉ, tôi biết tôi sẽ bị giết vì đã nói điều này. Nhưng người ta có thể mô phỏng một tài sản IsPostBack nếu họ muốn biết điều này. Nhưng tôi thấy tại sao không cần thiết. –

4

Như bạn đã nói, không có khái niệm về Postback trong ASP.NET MVC. Những gì bạn làm lạnh là kiểm tra động từ HTTP đã được sử dụng để thực hiện yêu cầu xem liệu đó có phải là POST hay không. Đây có thể là một trong hai sau một gửi biểu mẫu hoặc một yêu cầu AJAX:

public ActionResult Foo() 
{ 
    if (string.Equals("post", Request.HttpMethod, StringComparison.OrdinalIgnoreCase) 
    { 
     // The POST verb was used to invoke the controller action 
    } 
    ... 
} 
+0

Tôi thích điều này (và bây giờ đã học cách sử dụng string.equals quá) Bây giờ tôi chỉ cần tìm ra lý do tại sao tôi sẽ sử dụng string.equals như trái ngược với myString == someOtherString. Nhưng đó là một câu hỏi khác, trừ khi bạn muốn tiết kiệm cho tôi những rắc rối. Cảm ơn câu trả lời của bạn, +1. –

3

Bạn có thể trang trí các hành động với các thuộc tính thích hợp

[HttpGet] 
public ActionResult Foo() { 
    //Do pre-postback stuff here 
} 

[HttpPost] 
public ActionResult Foo() { 
    //Do postback stuff here 
} 
+0

Cảm ơn câu trả lời của bạn. Tôi sẽ sử dụng câu trả lời này làm câu trả lời được chấp nhận nhưng một người khác đã cung cấp một lời giải thích tốt hơn một chút. Tuy nhiên, tôi biết ơn thời gian của bạn. +1 –

+1

@jsmith Sẽ không có lỗi khi nói rằng 'Foo' đã tồn tại trong cùng một ngữ cảnh? – lbrahim

+0

+1 đến @ Md.Ibrahim câu trả lời là sai do quá tải là như nhau.cần thay đổi chữ ký của Foo() trong một trong các phương thức sao cho chúng có thể được phân biệt. – joedotnot

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