2010-04-30 45 views

Trả lời

8

Bạn có thể khai báo một hình thức như thế này trong View của bạn và có thể chỉ định bất cứ điều gì điều khiển hoặc hành động mà bạn muốn.

Html.BeginForm("SaveAll", "Category", FormMethod.Post); 

Nếu bạn ở trong bộ điều khiển thì bạn có thể sử dụng.

TempData["Model"] = Model; 
RedirectToAction("SaveAll", "Category"); 
+0

Tôi nghĩ rằng những gì OP đang cố gắng làm là cập nhật của mình các danh mục từ Chế độ xem sản phẩm và muốn giữ tất cả các loại này. –

+1

Không phải điều này ... Tôi cần nếu tôi đã ở trong một hành động và tạo một bài đăng lên một hành động khác trong bộ điều khiển khác ... – AndreMiranda

+1

@AndreMiranda, OK, nhưng không phải là mục tiêu cuối cùng để lưu danh mục của bạn? Bạn có quan tâm điều đó xảy ra miễn là điều đó xảy ra không, bằng cách sử dụng các phương pháp hay nhất? Bạn đang cố gắng để thực hiện? Nếu bạn chỉ cần gọi một phương thức điều khiển khác, điều đó có thể được thực hiện dễ dàng, mà không cần tạo một yêu cầu POST để thực hiện nó. –

2

Kể từ POST là một động từ cho một yêu cầu HTTP, điều này chỉ có ý nghĩa (như văn bản) nếu phương pháp .Save() khởi một kết nối HTTP loopback để thích hợp .SaveAll() tuyến đường, (như http://..../Category/SaveAll) và vượt qua bộ sưu tập hình thức như một phần của yêu cầu. Điều này là ngớ ngẩn và không được đề nghị, vì điều này sẽ phá vỡ khả năng của bạn để đơn vị kiểm tra bộ điều khiển này.

Nếu, tuy nhiên, bạn muốn gọi .SaveAll() và trả lại kết quả được hiển thị lại cho ứng dụng, bạn có thể sử dụng .RenderAction() và chuyển mẫu hoặc bộ sưu tập biểu mẫu đã nhận được thông số.

Hoặc, ở phía máy chủ, chỉ cần khởi tạo trình điều khiển Danh mục và gọi phương thức .SaveAll(), một lần nữa truyền mô hình nhận được bởi tham số .Save().

public ActionResult Save(MyModel m) 
{ 
    Category cat = new Category(); 

    return cat.SaveAll(m); 
} 

Tuy nhiên, bạn sẽ phải nhận kết quả từ cuộc gọi đó và đảm bảo cuộc gọi đó được xử lý chính xác theo chế độ xem kết quả.

Nếu đây là những gì bạn đang cố gắng làm, cần lưu ý rằng bạn thực sự nên có mã của phương pháp .SaveAll() thực hiện lưu được tách thành lớp logic kinh doanh chuyên dụng thay vì sống trong bộ điều khiển. Tất cả các chức năng này nên, theo lý thuyết, có sẵn để sử dụng trong một bộ điều khiển khác, hoặc trong một thư viện có thể được bao gồm trong các ứng dụng khác.

+0

Đồng ý, BLL là nơi dành cho việc này. –

+0

Nếu bạn là đơn vị kiểm tra bộ điều khiển của bạn thì bộ điều khiển của bạn đang làm quá nhiều. –

5

Tôi sẽ chỉ cập nhật danh mục của bạn trong kho lưu trữ từ Bộ điều khiển sản phẩm của bạn Lưu phương pháp trực tiếp hoặc cấu trúc lại chức năng Lưu danh mục theo phương pháp riêng của nó và gọi từ cả hai phương thức điều khiển.

+0

Kho lưu trữ không phải là mục tiêu của tôi ở đây ... xin lỗi – AndreMiranda

+0

+1 để nói "refactor", mà tôi đã lấy toàn bộ một đoạn văn. –

5
public class Product : Controller 
{ 
    ... 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Save(FormCollection productValues) 
    { 
     ... 
     RedirectToAction("SaveAll", "Category", new { formValues = productValues }); 
    } 
    ... 
} 

public class Category : Controller 
{ 
    ... 
    public ActionResult SaveAll(FormCollection formValues) 
    { 
     ... 
    } 
} 

Giả thiết là bạn đang thực hiện POST trong ngữ cảnh của Sản phẩm.

0

trở RedirectToAction ("ViewService", "Quản trị")

Ở đây, "ViewService" là Tên hoạt động và "Quản trị" là điều khiển Tên

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