2010-05-12 30 views
25

Tôi đã sử dụng response.redirect trong ASP và ASP.NET webforms cổ điển. Tuy nhiên, với MVC 2.0, tôi đang chạy vào một cái gì đó đặc biệt.Trong ASP.NET MVC, response.redirect hoạt động như thế nào?

Tôi có một phương pháp riêng trong một lớp điều khiển được sử dụng bởi nhiều phương pháp điều khiển để giúp tải và xác thực một số thông tin. Phương pháp riêng tư này được thiết lập để chuyển hướng nếu một vấn đề được phát hiện đến một trang thông báo lỗi chung.

Vấn đề lớn mà tôi nhận thấy là lớp trình điều khiển gọi và chế độ xem trang cố gắng hoàn tất hiển thị và tải trước khi thực sự chuyển hướng diễn ra. Điều này là khó chịu trong phát triển vì View ném ngoại lệ mà tôi cần phải bỏ qua trước khi trang lỗi chung chung của tôi cuối cùng tải.

Như đã đề cập ở trên, tôi đã quen với mô hình cũ hơn của response.redirect để ngăn mã tiếp theo trên trang được thực thi khi trang mới sẽ tải.

Bất kỳ trợ giúp hoặc lời khuyên nào về chuyển hướng trong MVC sẽ được đánh giá cao.

+1

Vui lòng chỉ cho chúng tôi mã của bạn. – SLaks

+0

Bạn đã từng nghe về một công cụ chẩn đoán có tên là "Fiddler" chưa? Bạn có thể thấy nó rất hữu ích để xem những gì các trang của bạn đang làm. –

+0

Tôi lấy nó bạn đang gọi 'Response.Redirect' trong phương pháp riêng của bạn? –

Trả lời

42

Cơ chế truyền thống để chuyển hướng trong ASP.Net MVC là để trở về một đối tượng kiểu RedirectResult cho khách hàng. Nếu điều này được thực hiện trước khi phương thức Xem của bạn được gọi, phương thức xem của bạn sẽ không bao giờ được gọi.

Nếu bạn gọi Response.Redirect, thay vì để cho bộ điều khiển phía trước của Asp.Net MVC làm điều đó cho bạn, phương thức điều khiển của bạn sẽ tiếp tục cho đến khi nó kết thúc hoặc ném một ngoại lệ.

Giải pháp thành ngữ cho vấn đề của bạn là để phương thức riêng của bạn trả về kết quả mà bộ điều khiển của bạn có thể sử dụng.

ví dụ:

public ActionResult Edit(MyEntity entity) 
{ 
    if (!IsValid()) return Redirect("/oops/"); 
    ... 
    return View(); 

} 

private bool IsValid() 
{ 
    if (nozzle==NozzleState.Closed) return false; 
    if (!hoseAttached) return false; 
    return (userRole==Role.Gardener); 
} 
+0

Điều này giải thích những gì tôi đã nhìn thấy và là một giải pháp tuyệt vời. Cảm ơn đã giúp đỡ! – Swoop

+0

Xin chào Jason, bạn có thể nhận xét về lý do mã tiếp tục thay vì chuỗi bị hủy bỏ, theo WebForms 'Response.Redirect'? –

+0

@ JasonTrue: Vâng, tôi cũng tự hỏi tại sao luồng không chấm dứt. –

18

Trong ASP.NET MVC, bạn thường chuyển hướng đến một trang khác bằng cách trả về một RedirectResult từ phương pháp điều khiển.

Ví dụ:

public ActionResult Details(int id) 
{ 
    // Attempt to get record from database 
    var details = dataContext.GetDetails(id); 

    // Does requested record exist? 
    if (details == null) 
    { 
     // Does not exist - display index so user can choose 
     return RedirectToAction("Index"); 
    } 

    // Display details as usual 
    return View(details); 
} 
+0

Câu trả lời hay. Cảm ơn đã giúp đỡ! – Swoop

-3

thử mã này theo quan điểm của MVC-mạch trang

 if (Session["UserName"] == null) 
     { 
      this.Response.Redirect("LogOn"); 

     } 
+4

Chúng tôi mạnh mẽ khuyến khích gọi Response.Redirect trong một ứng dụng MVC. Bạn nên trả về RedirectResult từ các hành động hoặc bộ lọc. – RickAndMSFT

+0

@RickAnd - MSFT Tại sao, nó không được khuyến khích? Tôi biết rằng rõ ràng RedirectResult là cấp trên nhưng tại sao Response.Redirect không khuyến khích? –

+0

Câu hỏi hay, Xem blog của tôi Response.Redirect và ASP.NET MVC - Không kết hợp tại http://blogs.msdn.com/b/rickandy/archive/2012/03/01/response-redirect-and-asp- net-mvc-do-not-mix.aspx – RickAndMSFT

7

Trong MVC bao giờ sử dụng Response.Redirect sử dụng

return RedirectToAction("ActionResultName", "ControllerName"); 

Đối với TẠI SAO KHÔNG sử dụng Response.Redirect trong MVC:

  1. Vấn đề về hiệu suất với nó
  2. Không theo tiêu chuẩn mô hình MVC asp.net và quy ước đã được xây dựng riêng cho MVC.
1

đề xuất và cách duy nhất để chuyển hướng đến asp.hình thức ròng trong controller action MVC bằng cách sử dụng

return Redirect("/page/pagename.aspx"); 

cách khác mà chúng tôi có thể chuyển hướng bằng cách sử dụng (không khuyến khích và cách xấu)

Response.Redirect("/page/pagename.aspx", true); 

nó sẽ làm việc cho chuyển hướng, nhưng vấn đề là nó sẽ xóa tất cả Giá trị phiên của chúng tôi. vậy tại sao nó không được khuyến khích.

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