2012-06-26 33 views
40

Trong số RedirectToAction bên dưới, tôi muốn chuyển một số viewmodel. Làm cách nào để chuyển mô hình đến chuyển hướng?Làm cách nào để bao gồm mô hình với RedirectToAction?

Tôi đặt điểm ngắt để kiểm tra giá trị của mô hình để xác minh mô hình được tạo chính xác. Nó là chính xác nhưng khung nhìn kết quả không chứa các giá trị được tìm thấy trong các thuộc tính mô hình.

// 
// model created up here... 
// 
return RedirectToAction("actionName", "controllerName", model); 

ASP.NET MVC 4 RC

+2

tôi sử dụng phương pháp đơn giản như thế này => return View ("actionName ", mô hình); – xameeramir

Trả lời

66

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 
} 
Các vấn đề liên quan