2013-06-09 5 views
26

У меня есть что-то вроде этого:передать несколько параметров в 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) 
} 

и в моем .cshtml:

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

Это прекрасно работает со следующим сообщением действий:

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

    return RedirectToAction(...); 

} 

Однако, я хочу передать дополнительный параметр из объекта @ViewBag.Club:

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

Как это кодировать в BeginForm?

ответ

60

Здесь есть два варианта.

  1. скрытое поле в форме или
  2. Добавьте его в маршрут значения параметра в методе начинают форме.

Редактировать

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

или

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

Thanks @Johan - обработано. (Метод 2). –

+0

@Johan есть ли большая разница между 2? – Vahx

+0

@ Я имел в виду больше по безопасности, производительности или чему-либо еще? это старый или новый способ? – Vahx

0

Другой вариант мне нравится, что можно обобщить, как только я начинаю видеть код не соответствует DRY, является использование одного контроллера, который перенаправляет на другой контроллер.

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

    return RedirectToAction(action, "Accounts"); 
} 

Я считаю, это позволяет мне применить мою логику в одном месте и повторно использовать его без придется посыпать JavaScript в воззрениях, чтобы справиться с этим. И, как я уже упоминал, я могу использовать рефакторинг для повторного использования, поскольку я вижу, что это злоупотребляет.

Смежные вопросы