Как отправить дополнительные параметры в @Ajax.Beginform() вместе со значениями модели?

Я использую @Ajax.BeginForm() в своем приложении asp.net mvc3. Поскольку страница тесно связана, она отправляет значения модели при нажатии кнопки отправки. Мое требование состоит в том, что при нажатии кнопки отправки мне нужно заполнить список, который присутствует вне формы, используя некоторую логику, и передать список значений Json, присутствующих в списке, в контроллер в качестве дополнительного параметра. Как этого добиться?

@using (Ajax.BeginForm("Controller_Method", "Controller_Name", new AjaxOptions { HttpMethod = "POST", OnSuccess = "SUCCESS" }))
{
}

<select id="listbx">
 <option value="volvo">Volvo</option>
 <option value="saab">Saab</option>
 <option value="mercedes">Mercedes</option>
 <option value="audi">Audi</option>
</select>

При нажатии кнопки отправки я добавляю элемент в список с помощью jQuery и хочу передать все элементы в качестве параметра json контроллеру.


person Dixit Gokhale    schedule 27.05.2013    source источник


Ответы (1)


Вы можете clone выбрать поле выбора внутри формы в скрытом div перед отправкой формы.

Также не забудьте добавить атрибут name в список выбора, иначе ничего не будет отправлено в контроллер:

@using (Ajax.BeginForm("Controller_Method", "Controller_Name", new AjaxOptions { HttpMethod = "POST", OnSuccess = "SUCCESS", OnBegin = "beforeSend" }))
{
    <div id="listBoxContainer" style="display:none;"></div>
}

<select id="listbx" name="listbox">
 <option value="volvo">Volvo</option>
 <option value="saab">Saab</option>
 <option value="mercedes">Mercedes</option>
 <option value="audi">Audi</option>
</select>

а затем реализовать обратный вызов beforeSend для клонирования поля выбора в форму:

function beforeSend() {
    $('#listBoxContainer').html($('#listbx').clone());
}
person Darin Dimitrov    schedule 27.05.2013
comment
Спасибо. Но как мне принять значение в контроллере? Должен ли я добавить параметр? Потому что я не могу связать с ним параметр модели. Я не возражаю, если я смогу отправить весь список #listbx в виде массива json в качестве параметра. Как это сделать? - person Dixit Gokhale; 27.05.2013
comment
У вас будет параметр с тем же name, что и в раскрывающемся списке (listbox в моем примере). - person Darin Dimitrov; 27.05.2013
comment
Я сделал именно так, как ты сказал. Но все же параметр модели возвращается в контроллер равным нулю. Можете показать код контроллера? - person Dixit Gokhale; 28.05.2013
comment
Вот сигнатура действия контроллера: [HttpPost]public ActionResult Controller_Method(string listbox) { ... }. Список вещей, которые нужно проверить: консоль javascript на наличие ошибок; откройте вкладку сети в инструменте отладки javascript, чтобы увидеть, что именно отправляется на сервер. Если вы не видите значение listbox в полезной нагрузке запроса, вы, вероятно, забыли добавить к нему имя. - person Darin Dimitrov; 28.05.2013