RedirectToAction với tham số


596

Tôi có một hành động tôi gọi từ một mỏ neo, do Site/Controller/Action/IDđó, IDmột int.

Sau này tôi cần chuyển hướng đến cùng Hành động này từ Bộ điều khiển.

Có một cách thông minh để làm điều này? Hiện tại tôi đang sử dụng IDtempdata, nhưng khi bạn nhấn f5 để làm mới trang sau khi quay lại, tempdata sẽ biến mất và trang bị sập.

Câu trả lời:


946

Bạn có thể truyền id dưới dạng một phần của tham số routeValues ​​của phương thức RedirectToAction ().

return RedirectToAction("Action", new { id = 99 });

Điều này sẽ gây ra chuyển hướng đến Trang web / Trình điều khiển / Hành động / 99. Không cần temp hoặc bất kỳ loại dữ liệu xem.


2
Có cách nào để làm điều đó hoặc một cái gì đó tương tự nhưng cũng chỉ định bộ điều khiển? (Tôi cần phải làm điều đó từ một bộ điều khiển đến một hành động của bộ điều khiển khác).
Diego

18
@Diego: vâng, có một vài tình trạng quá tải cho điều đó. Trong ví dụ của tôi, đó sẽ là RedirectToAction ("Hành động", "Trình điều khiển", mới {id = 99}) msdn.microsoft.com/en-us/l Library / dd470154.aspx
Kurt Schindler

10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
Jeremy A. West

Có cách nào để làm điều tương tự nhưng không có cập nhật url như vậy không?
Worthy7

@KurtSchindler Dù sao cũng phải cập nhật câu trả lời của bạn để bao gồm ví dụ nhận xét của bạn về chuyển hướng đến bộ điều khiển khác? Để giúp những người có thể bỏ qua đọc bình luận.
Edward

194

Câu trả lời của Kurt là đúng, từ nghiên cứu của tôi, nhưng khi tôi thử nó, tôi phải làm điều này để khiến nó thực sự hoạt động với tôi:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id } ) );

Nếu tôi không chỉ định bộ điều khiển và hành động trong RouteValueDictionarynó không hoạt động.

Ngoài ra khi được mã hóa như thế này, tham số đầu tiên (Hành động) dường như bị bỏ qua. Vì vậy, nếu bạn chỉ định bộ điều khiển trong Dict và mong đợi tham số đầu tiên chỉ định Hành động, thì nó cũng không hoạt động.

Nếu bạn đến sau, hãy thử câu trả lời của Kurt trước và nếu bạn vẫn gặp sự cố, hãy thử câu hỏi này.


6
Câu trả lời chính xác. Ngoài ra, tôi tin rằng controllertham số này là tùy chọn nếu hành động chuyển hướng nằm trong cùng bộ điều khiển với hành động bạn chuyển hướng từ đó.
im1dermike

1
đáng lẽ phải như vậy, nhưng khi tôi làm theo cách đó, nó không hoạt động, tôi phải thêm bộ điều khiển một cách rõ ràng ... đó là nghĩa đen trong những ngày đầu tiên của tôi vào MVC, nếu tôi phải đoán bây giờ tôi sẽ nói tôi có một số loại vấn đề thiết lập định tuyến để xem xét.
Eric Brown - Cal

Kỳ dị. Hoạt động với tôi trong MVC4.
im1dermike

Điều này đã xảy ra trong MVC1 ngày và nó hoạt động tốt với những người khác, đó là lý do tại sao tôi nghi ngờ vấn đề cấu hình, nhìn lại.
Eric Brown - Cal

@ EricBrown-Cal Đưa ra ngay cả bài viết của bạn trong bình luận của bạn không bạn nghĩ câu trả lời của Kurt phù hợp hơn cho những người tìm kiếm câu trả lời cho cùng một vấn đề bạn gặp phải trong những ngày đầu?
Edward

62

RedirectToAction với tham số:

return RedirectToAction("Action","controller", new {@id=id});

1
Nó có hoạt động không? Tôi tin rằng đây là cú pháp không chính xác. Sửa tôi nếu tôi sai.
Mohammed Zameer

1
@ pb2q cũng new {id = id}hoạt động tốt vì khung công tác biết biến bạn đang đề cập đến.
Edward

61

Cũng cần lưu ý rằng bạn có thể chuyển qua hơn 1 tham số. id sẽ được sử dụng để tạo một phần của URL và bất kỳ phần nào khác sẽ được chuyển qua dưới dạng tham số sau một? trong url và sẽ được UrlEncoding làm mặc định.

ví dụ

return RedirectToAction("ACTION", "CONTROLLER", new {
           id = 99, otherParam = "Something", anotherParam = "OtherStuff" 
       });

Vì vậy, url sẽ là:

    /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff

Chúng có thể được tham chiếu bởi bộ điều khiển của bạn:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }

43
//How to use RedirectToAction in MVC

return RedirectToAction("actionName", "ControllerName", routevalue);

thí dụ

return RedirectToAction("Index", "Home", new { id = 2});

39

Ví dụ về MVC 4 ...

Lưu ý rằng không phải lúc nào bạn cũng phải truyền tham số có tên ID

var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. ";
return RedirectToAction("ThankYou", "Account", new { whatever = message });

Và,

public ActionResult ThankYou(string whatever) {
        ViewBag.message = whatever;
        return View();
} 

Tất nhiên, bạn có thể gán chuỗi cho các trường mô hình thay vì sử dụng ViewBag nếu đó là tùy chọn của bạn.



21
RedirectToAction("Action", "Controller" ,new { id });

Làm việc cho tôi, không cần phải làm new{id = id}

Tôi đã chuyển hướng đến trong cùng một bộ điều khiển vì vậy tôi không cần "Controller"nhưng tôi không chắc về logic cụ thể phía sau khi bộ điều khiển được yêu cầu làm tham số.


RedirectToAction("Action", "Controller", new { id = id});chỉ là những gì tôi cần trong ứng dụng Core 3.1 của mình.
orangecaterpillar

18

Nếu ai đó muốn Hiển thị thông báo lỗi [httppost]thì anh ấy / cô ấy có thể thử bằng cách chuyển ID bằng cách sử dụng

return RedirectToAction("LogIn", "Security", new { @errorId = 1 });

để biết chi tiết như thế này

 public ActionResult LogIn(int? errorId)
        {
            if (errorId > 0)
            {
                ViewBag.Error = "UserName Or Password Invalid !";
            }
            return View();
        }

[Httppost]
public ActionResult LogIn(FormCollection form)
        {
            string user= form["UserId"];
            string password = form["Password"];
            if (user == "admin" && password == "123")
            {
               return RedirectToAction("Index", "Admin");
            }
            else
            {
                return RedirectToAction("LogIn", "Security", new { @errorId = 1 });
            }
}

Hy vọng nó hoạt động tốt.


16

....

int parameter = Convert.ToInt32(Session["Id"].ToString());

....

return RedirectToAction("ActionName", new { Id = parameter });

15

Tôi cũng gặp vấn đề này và một cách khá hay để làm nếu bạn ở trong cùng một bộ điều khiển là sử dụng các tham số có tên:

return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });

7

Điều này có thể là từ nhiều năm trước nhưng dù sao đi nữa, điều này cũng phụ thuộc vào tuyến bản đồ Global.asax của bạn vì bạn có thể thêm hoặc chỉnh sửa các tham số để phù hợp với những gì bạn muốn.

ví dụ.

Toàn cầu

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            //new { controller = "Home", action = "Index", id = UrlParameter.Optional 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional,
                  extraParam = UrlParameter.Optional // extra parameter you might need
        });
    }

sau đó các tham số bạn cần truyền sẽ thay đổi thành:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );

7

Nếu bạn cần chuyển hướng đến một hành động bên ngoài bộ điều khiển, nó sẽ hoạt động.

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });

1

Sau đây đã thành công với lõi asp.net 2.1. Nó có thể áp dụng ở nơi khác. Từ điển ControllerBase.ControllContext.RouteData.Values ​​có thể truy cập trực tiếp và ghi được từ bên trong phương thức hành động. Có lẽ đây là đích đến cuối cùng của dữ liệu trong các giải pháp khác. Nó cũng cho thấy dữ liệu định tuyến mặc định đến từ đâu.

[Route("/to/{email?}")]
public IActionResult ToAction(string email)
{
    return View("To", email);
}
[Route("/from")]
public IActionResult FromAction()
{
    ControllerContext.RouteData.Values.Add("email", "mike@myemail.com");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/mike@myemail.com
}
[Route("/FromAnother/{email?}")]`
public IActionResult FromAnotherAction(string email)
{
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/<whatever the email param says>
         // no need to specify the route part explicitly
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.