2008-09-24 26 views
94

Khi bạn gọi RedirectToAction trong bộ điều khiển, nó sẽ tự động chuyển hướng bằng cách sử dụng HTTP GET. Làm cách nào để nói rõ ràng để sử dụng HTTP POST?Làm thế nào để bạn chuyển hướng đến một trang bằng cách sử dụng động từ POST?

Tôi có một hành động chấp nhận cả yêu cầu GET và POST và tôi muốn có thể RedirectToAction sử dụng POST và gửi một số giá trị.

Như thế này:

this.RedirectToAction(
    "actionname", 
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" }) 
); 

Tôi muốn someValueanotherValue giá trị phải được gửi bằng HTTP POST thay vì một GET. Có ai biết cách để làm điều này không?

Trả lời

84

HTTP không hỗ trợ chuyển hướng đến trang bằng POST. Khi bạn chuyển hướng đến đâu đó, tiêu đề "Vị trí" HTTP sẽ cho trình duyệt biết nơi cần đi và trình duyệt sẽ thực hiện yêu cầu GET cho trang đó. Có thể bạn sẽ phải viết mã cho trang của mình để chấp nhận các yêu cầu GET cũng như các yêu cầu POST.

+4

Tò mò tại sao câu trả lời của tôi không được chấp nhận, tôi nghĩ rằng lời lẽ của tôi là âm thanh. :) Sau đó, một lần nữa, tôi có thể là một chút thiên vị về nó ... –

+12

Trong khi câu trả lời này về cơ bản là chính xác, nó không phải là hoàn chỉnh. Xem Jason Bunting trả lời dưới đây để giải quyết tốt hơn nhiều. –

132

Ví dụ cụ thể của bạn, tôi sẽ chỉ làm điều này, kể từ khi bạn rõ ràng là không quan tâm đến thực sự có trình duyệt trở nên chuyển hướng nào (nhờ chấp nhận câu trả lời bạn đã được chấp nhận):

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index() { 
    // obviously these values might come from somewhere non-trivial 
    return Index(2, "text"); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(int someValue, string anotherValue) { 
    // would probably do something non-trivial here with the param values 
    return View(); 
} 

Điều đó làm việc dễ dàng và không có doanh nghiệp vui nhộn thực sự xảy ra - điều này cho phép bạn duy trì thực tế là thứ hai chỉ chấp nhận yêu cầu HTTP POST (ngoại trừ trong trường hợp này, dưới sự kiểm soát của bạn) và bạn không có để sử dụng TempData, đó là những gì liên kết bạn đăng trong câu trả lời của bạn là gợi ý.

Tôi rất muốn biết điều gì là "sai" với điều này, nếu có bất cứ điều gì. Rõ ràng, nếu bạn thực sự đã gửi cho trình duyệt một chuyển hướng, điều này sẽ không hoạt động, nhưng sau đó bạn nên hỏi tại sao bạn sẽ cố gắng chuyển đổi nó bất kể, vì nó có vẻ lạ với tôi.

Hy vọng điều đó sẽ hữu ích.

+7

Ai biết tại sao bạn bị bỏ phiếu. Đây là một phương pháp rất hữu ích. –

+1

Làm việc cho tôi quá, cảm ơn. –

+2

Đây là cách tôi luôn giải quyết vấn đề này. Downvoting điều này không có ý nghĩa. –

3

Bài đăng trả lời của jason sẽ hoạt động trong hầu hết các trường hợp, vấn đề duy nhất tôi thấy là dễ bị tai nạn. tức là Gọi trực tiếp phương thức hành động bỏ qua tất cả các bộ lọc áp dụng cho hành động. Vì vậy, trong trường hợp có bất kỳ loại xác thực hoặc bộ lọc truy cập nào được áp dụng cho phương thức hành động, dữ liệu đó có thể bị mất. Gọi phương thức hành động trực tiếp sẽ hoạt động nhưng cần được áp dụng cẩn thận.

16

Nếu bạn muốn chuyển dữ liệu giữa hai hành động trong khi chuyển hướng mà không bao gồm bất kỳ dữ liệu nào trong chuỗi truy vấn, hãy đặt mô hình trong đối tượng TempData.

HÀNH ĐỘNG

TempData["datacontainer"] = modelData;

XEM

var modelData= TempData["datacontainer"] as ModelDataType; 

TempData được hiểu là một trường hợp rất ngắn ngủi, và bạn chỉ nên sử dụng nó trong thời gian hiện tại và chỉ yêu cầu tiếp theo! Vì TempData hoạt động theo cách này, bạn cần phải biết chắc chắn yêu cầu tiếp theo sẽ là gì và chuyển hướng đến một chế độ xem khác là lần duy nhất bạn có thể đảm bảo điều này.

Do đó, trường hợp duy nhất sử dụng TempData sẽ hoạt động đáng tin cậy là khi bạn đang chuyển hướng.

4

thử này một

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>"); 
3

tôi muốn mở rộng câu trả lời của Jason Bunting

như thế này

ActionResult action = new SampelController().Index(2, "text"); 
return action; 

Và Eli sẽ ở đây cho một cái gì đó ý tưởng về làm thế nào để làm cho nó biến chung chung

Có thể nhận tất cả các loại bộ điều khiển

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