2012-10-22 22 views
10

Dưới đây là những gì tôi đang cố gắng để làm:Chuyển đối tượng mô hình sang RedirectToAction mà không gây ô nhiễm URL?

public ActionResult Index() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Index(ContactModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Send email using Model information. 

     return RedirectToAction("Gracias", model); 
    } 

    return View(model); 
} 

public ActionResult Gracias(ContactModel model) 
{ 
    return View(model); 
} 

Cả ba phương pháp hành động trong bộ điều khiển tương tự. Về cơ bản, người dùng gõ một số dữ liệu trong biểu mẫu liên hệ và tôi muốn chuyển hướng họ đến trang cảm ơn bằng tên của họ trong đối tượng Mô hình.

Vì mã này hoạt động, nhưng URL được chuyển cùng với các biến GET. Không lý tưởng.

http://localhost:7807/Contacto/Gracias?Nombre=Sergio&Apellidos=Tapia&Correo=opiasdf&Telefono=oinqwef&Direccion=oinqef&Pais=oinqwef&Mensaje=oinqwef 

Mọi đề xuất?

Trả lời

24

Âm thanh như một giải pháp cho TempData!

[HttpPost] 
public ActionResult Index(ContactModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    // Send email using Model information. 
    TempData["model"] = model; 
    return RedirectToAction("Gracias"); 
    } 

    return View(model); 
} 

public ActionResult Gracias() 
{ 
    ContactModel model = (ContactModel)TempData["model"]; 
    return View(model); 
} 
+0

Tôi không biết bạn có thể tiết kiệm các loại phức tạp vào từ điển TempData. TIL. Cảm ơn! – sergserg

+1

Chỉ miễn là chúng được Serializable !! TempData được lưu trữ trong phiên làm việc, chỉ cho phép các đối tượng/lớp Serializable. –

+2

Nhiệt độ dữ liệu chắc chắn có thể hoạt động ở đây nhưng tại sao không chỉ hiển thị chế độ xem "Gracias" trực tiếp từ Chỉ mục (nơi mà mô hình đã có trong phạm vi). Bạn cũng có thể tiết kiệm cho mình một chuyến đi khứ hồi của máy chủ mà về cơ bản là một chuyển hướng vô dụng. –

0

Câu trả lời nhanh chóng là không vượt qua toàn bộ mô hình nhưng một số nhận dạng mà bạn có thể sử dụng để lấy mô hình từ kho:

[HttpPost] 
public ActionResult Index(ContactModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Send email using Model information. 

     return RedirectToAction("Gracias", model.ID); 
    } 

    return View(model); 
} 

public ActionResult Gracias(int contactID) 
{ 
    ContactModel model = new ContractRepository().GetContact(contactID); 
    return View(model); 
} 
+0

Điều này không hoạt động theo cách bạn nghĩ. Nếu tôi chuyển qua một mô hình cập nhật trong phương thức 'HttpPost Index()', tất cả những thay đổi đó sẽ bị mất * bởi vì tất cả các giá trị trong phương thức 'Gracias()' là từ cơ sở dữ liệu chứ không phải người dùng. –

0

Thay vì làm

return RedirectToAction("Gracias", model); 

Bạn có thể làm

[HttpPost] 
public ActionResult Index(ContactModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Send email using Model information. 

     return View("Gracias", model); 
    } 

    return View(model); 
} 

và xóa hành động bộ điều khiển Gracias của bạn. Sử dụng phía trên chế độ xem "Gracias" sẽ được hiển thị với mô hình ContactModel của bạn.

Tôi không thấy cần phải có một hành động điều khiển riêng biệt nếu nó sử dụng cùng một mô hình và là một phần bước khóa của quy trình công việc cũ. "POST thành công cho chỉ mục sẽ luôn dẫn đến hiển thị Gracias thành công"

Bạn cũng có thể lưu mô hình trong TempData (giống như trạng thái phiên yêu cầu 1) nhưng tôi không thấy bất kỳ điểm nào khi thực hiện điều đó trong tình huống của bạn vì nó chỉ làm phức tạp mọi thứ

Suy nghĩ?

+0

Url sẽ trông giống như 'http: // localhost: 7807/Contacto/Index', nếu đó là chấp nhận được, thì đây là cách dễ nhất. –

+0

Vâng, điều đó không thể chấp nhận được vì vậy tôi không đi tuyến đường này. – sergserg

+0

Bây giờ chỉ hy vọng một người nào đó không nhấn "http: // localhost: 7807/Contacto/Gracias" vào một thời điểm khác (hoặc nếu họ nhấn nút quay lại và trang không được lưu trong bộ nhớ cache) vì sẽ quay lại với chế độ xem với các trường trống và thậm chí có thể là ngoại lệ tùy thuộc vào giao diện của bạn. Xem xét rằng bạn có thể không thực sự muốn một URL khác được hiển thị. –

0

Điều này có thể dễ dàng thực hiện mà không cần chuyển hướng không?

Đây là những gì tôi có:

[HttpGet] 
    public ActionResult Contact() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Contact(EmailResponse response) 
    { 
     if(ModelState.IsValid){ 
      return View("Thanks", response); 
     } 
     else 
     { 
      return View(); 
     } 
    } 

Quan điểm "Thanks" được gõ mạnh lên EmailResponse

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