RedirectToAction
trả về một phản ứng 302 cho trình duyệt của khách hàng và do đó trình duyệt sẽ gửi một yêu cầu GET mới để url ở vị trí giá trị tiêu đề của câu trả lời đã đến trình duyệt.
Nếu bạn đang cố gắng chuyển mô hình chế độ xem căn hộ đơn giản sang phương pháp hành động thứ hai, bạn có thể sử dụng this overload của phương pháp RedirectToAction
.
protected internal RedirectToRouteResult RedirectToAction(
string actionName,
string controllerName,
object routeValues
)
Các RedirectToAction
sẽ chuyển đổi các đối tượng thông qua (routeValues) vào một chuỗi truy vấn và thêm rằng để url (được tạo ra từ 2 thông số đầu tiên chúng tôi đi qua) và sẽ nhúng các url dẫn đến location tiêu đề của phản ứng .
Giả sử mô hình điểm của bạn là như thế này
public class StoreVm
{
public int StoreId { get; set; }
public string Name { get; set; }
public string Code { set; get; }
}
Và bạn trong phương pháp hành động đầu tiên của bạn, bạn có thể vượt qua một đối tượng điều này với phương pháp RedirectToAction
như thế này
var m = new Store { StoreId =101, Name = "Kroger", Code = "KRO"};
return RedirectToAction("Details","Store", m);
Mã này sẽ gửi trả lời 302 cho trình duyệt có giá trị tiêu đề vị trí là
Store/Details?StoreId=101&Name=Kroger&Code=KRO
Giả sử tham số của phương thức tác vụ Details
là loại StoreVm
, giá trị tham số truy vấn sẽ được ánh xạ chính xác đến thuộc tính của tham số.
public ActionResult Details(StoreVm model)
{
// model.Name & model.Id will have values mapped from the request querystring
// to do : Return something.
}
Ở trên sẽ hoạt động để truyền mô hình chế độ xem phẳng nhỏ. Nhưng nếu bạn muốn truyền một đối tượng phức tạp, bạn nên cố gắng làm theo mẫu PRG.
PRG Pattern
PRG là viết tắt của POST - REDIRECT - GET. Với cách tiếp cận này, bạn sẽ đưa ra một phản hồi chuyển hướng với một id duy nhất trong chuỗi truy vấn, sử dụng phương thức GET thứ hai có thể truy vấn lại tài nguyên và trả về một cái gì đó cho khung nhìn.
int newStoreId=101;
return RedirectToAction("Details", "Store", new { storeId=newStoreId});
Điều này sẽ tạo ra các url Store/Details?storeId=101
và trong hành động chi tiết GET
của bạn, bằng cách sử dụng StoreID thông qua tại, bạn sẽ nhận được/xây dựng các đối tượng StoreVm
từ một nơi nào (từ một dịch vụ hoặc truy vấn cơ sở dữ liệu vv)
public ActionResult Details(string storeId)
{
// from the storeId value, get the entity/object/resource
var store = yourRepo.GetStore(storeId);
if(store!=null)
{
// Map the the view model
var storeVm = new StoreVm { Id=storeId, Name=store.Name,Code=store.Code};
return View(storeVm);
}
return View("StoreNotFound"); // view to render when we get invalid store id
}
TempData
Tiếp theo PRG pattern là một giải pháp tốt hơn để xử lý các trường hợp sử dụng này. Nhưng nếu bạn không muốn làm điều đó và thực sự muốn vượt qua một số dữ liệu phức tạp trên Stateless HTTP yêu cầu, bạn có thể sử dụng một số cơ chế lưu trữ tạm thời như TempData
TempData["NewCustomer"] = model;
return RedirectToAction("Index", "Users");
Và đọc nó trong phương thức hành động GET
bạn một lần nữa .
public ActionResult Index()
{
var model=TempData["NewCustomer"] as Customer
return View(model);
}
TempData
sử dụng Session
đối tượng phía sau cảnh để lưu trữ dữ liệu. Nhưng một khi dữ liệu được đọc dữ liệu được chấm dứt.
Rachel đã viết một blog đẹp post giải thích thời điểm sử dụng TempData/ViewData. Đáng để đọc.
Sử dụng TempData để truyền dữ liệu mô hình để yêu cầu chuyển hướng trong Asp.Net Lõi
Trong Asp.Net lõi, bạn không thể vượt qua các loại phức tạp trong TempData. Bạn có thể chuyển các loại đơn giản như string
, int
, Guid
v.v.
Nếu bạn hoàn toàn muốn truyền đối tượng kiểu phức tạp qua TempData, bạn có 2 tùy chọn.
1) Sắp xếp hàng loạt đối tượng của bạn thành một chuỗi và chuyển nó.
Đây là một mẫu sử dụng Json.NET để serialize các đối tượng thành một chuỗi
var s = Newtonsoft.Json.JsonConvert.SerializeObject(createUserVm);
TempData["newuser"] = s;
return RedirectToAction("Index", "Users");
Bây giờ trong phương pháp hành động Index
của bạn, đọc giá trị này từ TempData và deserialize nó để đối tượng CreateUserViewModel
lớp học của bạn.
public IActionResult Index()
{
if (TempData["newuser"] is string s)
{
var newUser = JsonConvert.DeserializeObject<CreateUserViewModel>(s);
// use newUser object now as needed
}
// to do : return something
}
2) Đặt một cuốn từ điển các loại đơn giản để TempData
var d = new Dictionary<string, string>
{
["FullName"] = rvm.FullName,
["Email"] = rvm.Email;
};
TempData["MyModelDict"] = d;
return RedirectToAction("Index", "Users");
và đọc nó sau này
public IActionResult Index()
{
if (TempData["MyModelDict"] is Dictionary<string,string> dict)
{
var name = dict["Name"];
var email = dict["Email"];
}
// to do : return something
}
tôi sử dụng phương pháp đơn giản như thế này => return View ("actionName ", mô hình); – xameeramir