2013-06-09 56 views
26

Tôi có một cái gì đó như thế này:đèo nhiều tham số trong Html.BeginForm MVC

public ActionResult Create(int clubid) 
{ 
    var club = db.Clubs.Single(c=>c.Id == clubid); 
    ViewBag.Club = club; 
    Competition comp = db.Competitions.Create(); 
    return View(comp) 
} 

và trong .cshtml tôi:

@Model Models.Competition 
... 
@Using(Html.BeginForm()) 
{ 
    ... 
    <input type="submit" value="Save" /> 
} 

này hoạt động tốt với các hành động bài viết sau đây:

[HttpPost] 
public ActionResult Create(Competition comp) 
{ 
    if (ModelState.IsValid){...} 

    return RedirectToAction(...); 

} 

Tuy nhiên, tôi muốn chuyển một thông số bổ sung từ đối tượng @ViewBag.Club:

[HttpPoSt] 
public ActionResult Create(int clubid, Competition comp){...} 

Làm cách nào để mã này trong số BeginForm?

Trả lời

60

Có hai tùy chọn ở đây.

  1. một lĩnh vực tiềm ẩn trong hình thức, hoặc
  2. Thêm nó vào con đường giá trị tham số trong phương pháp bắt đầu hình thức.

Sửa

@Html.Hidden("clubid", ViewBag.Club.id) 

hoặc

@using(Html.BeginForm("action", "controller", 
         new { clubid = @Viewbag.Club.id }, FormMethod.Post, null) 
+1

Cảm ơn @Johan - đã làm việc điều trị. (Phương pháp 2). –

+0

@Johan có sự khác biệt lớn nào giữa 2 không? – Vahx

+0

@ Tôi có ý nghĩa nhiều hơn trong giới hạn về an ninh, hiệu suất hay bất cứ điều gì? là một cách cũ hay cách mới? – Vahx

0

Một tùy chọn khác Tôi thích, có thể được khái quát hóa một khi tôi bắt đầu thấy mã không phù hợp với khô, là sử dụng một bộ điều khiển chuyển hướng đến một bộ điều khiển khác.

public ActionResult ClientIdSearch(int cid) 
{ 
    var action = String.Format("Details/{0}", cid); 

    return RedirectToAction(action, "Accounts"); 
} 

Tôi thấy điều này cho phép tôi áp dụng logic của mình ở một nơi và sử dụng lại nó mà không phải rải JavaScript trong chế độ xem để xử lý việc này. Và, như tôi đã đề cập, tôi có thể tái cấu trúc lại để sử dụng lại khi tôi thấy điều này bị lạm dụng.

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