2010-10-25 35 views
33

Tôi hiện đang có một phương thức trong bộ điều khiển của mình chấp nhận một bộ sưu tập biểu mẫu, lưu dữ liệu và sau đó hiển thị dữ liệu trong trang 'Chi tiết'. Tại thời điểm này, các mã hiện trông giống như sau:Chuyển hướng ASP.NET MVC với kiểu

[HttpPost] 
public ActionResult Create(PersonModel person)<br> 
{ 
    if (person.IsValid()) 
    { 
     person.additionalData = "Person created successfully"; 
     return View("Details", person); 
    } 
} 

Vấn đề là trả lại chi tiết Hiển thị theo cách này vẫn giữ được URL mysite/Người/Tạo - lý tưởng tôi muốn URL đó thành mysite/Người/Chi tiết/IdGoesHere.

Hãy chắc chắn điều này là có thể. Rõ ràng, tôi có thể sử dụng Response.Redirect, tuy nhiên điều này không cho phép tôi chuyển mô hình cho khung nhìn. Theo như tôi có thể nói, tôi không thể vượt qua mô hình bằng cách sử dụng RedirectToAction?

Cảm ơn sự giúp đỡ.

EDIT: Để xác nhận - mô hình được tạo bởi tác vụ Tạo khác với mô hình mặc định được tạo bởi tác vụ Chi tiết. Do đó, thực hiện chuyển hướng thẳng đến Hành động và chuyển Id không hoạt động như mô hình được tạo không chính xác. Để cung cấp thêm ngữ cảnh, mô hình từ hành động Tạo chứa một giá trị bổ sung cho biết 'Người tạo thành công', nếu tôi chuyển hướng đến hành động Chi tiết, thông báo này không có trong mô hình.

Trả lời

29

user460667,

trực tiếp từ ứng dụng của riêng tôi:

public ActionResult Create(Booking item) 
{ 
    if (ModelState.IsValid) 
    { 
     int newID = _tasks.Create(item); 
     // NEW section to emulate model being populated for use in Details view 
     TempData["additionalData"] = "Person created successfully"; 
     return RedirectToAction("Details", new { id = newID }); 
    } 
    else 
    { 
     return View(); 
    } 
} 

sau đó, không thể hành động chi tiết của bạn được như thế này:

public ActionResult Details(int id) 
{ 
    var item = _tasks.GetByKey(id); 
    var additionalData = TempData["additionalData"]; 
    if(item != null) { 
     if(additonalMessage!=null) 
     { 
      item.additionalData = additionalData; 
     } 
     return View(item); 
    } 
    else 
     return View("Notfound"); 
} 

bạn không thể chấp nhận một cách tiếp cận tương tự?

[sửa]:

người sử dụng, tái bạn EDIT. bạn có thể không chỉ làm chuyển hướng theo quy ước và có một bộ cờ (trên tempdata như trên) cung cấp cho thông điệp này ?? cờ tempadata CHỈ được đặt bên trong hành động Tạo, do đó sẽ chỉ xảy ra khi tạo đối tượng 'người' mới. do đó hành động chi tiết sẽ chỉ bao giờ thấy nó như là một hệ quả của Create hành động

+3

Đây là cách để thực hiện.Nếu một thông điệp đơn giản trong tempdata không đủ, bạn có thể ném toàn bộ đối tượng 'PersonModel' vào tempdata và lấy nó từ tempdata trong phương thức' Details' action của bạn. – Charlino

6

Điều này sẽ đưa bạn đến Mô hình chi tiết, chuyển ID với nó.

return RedirectToAction("Details", new { id = person.PersonID }); 
+0

Xin chào, vấn đề với điều này là hành động mặc định không điền mô hình với cùng dữ liệu như thể nó đến thông qua hành động 'Tạo'. Nhìn vào các câu trả lời khác, giải pháp tốt nhất có vẻ là TempData. – user460667

+1

Bạn có thể tạo phương thức InitializeModel thực hiện tất cả phép gán dữ liệu cho bạn .. –

6

tâm bạn cũng có thể lấy cách tiếp cận kiểu an của MvcContrib và làm

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID)); 
+0

Và nếu bạn không muốn toàn bộ sức mạnh của MvcContrib, bạn có thể sử dụng MvcNavigationHelpers tại https://github.com/uglybugger/MvcNavigationHelpers –

8

Bạn có thể bổ sung những gì đã được cung cấp (sử dụng RedirectToAction và định tuyến) với việc sử dụng TempData

[HttpPost] 
public virtual ActionResult Create(IEnumerable<OrderItem> orderItems) 
    { 
     if (orderItems.Count() == 0) 
     { 
      return RedirectToAction("NoOrderItems"); 
     } 
     else 
     { 
      TempData["orderItems"] = orderItems; 
      return RedirectToAction("Confirm"); 
     } 
    } 

    [HttpGet] 
    public virtual ActionResult Confirm() 
    { 
     var orderItems = TempData["orderItems"] as IEnumerable<OrderItem>; 
     if (orderItems == null || orderItems.Count() == 0) 
     { 
      this.InvokeHttp404(ControllerContext.HttpContext); 
     } 

     return View(orderItems); 
    } 

tôi sử dụng này cho các hạng mục mà tôi có thể không muốn tạo ra một lần nữa vào yêu cầu tiếp theo hoặc tồn tại khá được nêu ra trong cơ sở dữ liệu được nêu ra. Với điều này, tôi không cần kiểm tra null trong quan điểm của tôi, như trang xác nhận chỉ có thể được "nhận" nếu có dữ liệu cho nó.

+0

mã tuyệt vời mà tôi chưa thử nghiệm nó nhưng sớm phải làm việc trên thành phần đó, tôi có một câu hỏi, nếu tôi làm mới trang là nó sẽ hoạt động hoặc tempdata sẽ hết hạn –

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