2009-10-19 4 views
3

У меня есть приложение ASP.NET MVC с формой. Скажем, у этой формы есть произвольное количество кнопок, каждое из которых имеет собственное действие.Две или несколько кнопок действий в форме MVC - Лучшая практика

<input type="button" id="action1" value="One" /> 
<input type="button" id="action2" value="Two" /> 
... and so forth 

Мы хотим, чтобы пользователь нажимать на одну и есть действие огня JQuery представить форму, а затем REPOST форме с новой информацией.

Существует несколько способов реализации этого. Какова наилучшая практика в дизайне? Просьба предоставить фрагменты кода, если можно.

+0

Я сомневаюсь, что мой совет гарантирует целый ответ, так что вот что: полезно использовать кнопки, разработанные таким образом, чтобы действие, которое вы хотите, чтобы пользователь выполнял, выделяется больше всего. Это звучит как здравый смысл, но иногда бывает трудно обойтись, не обманывая его в глазах пользователя. –

+0

>> Есть несколько способов реализовать это. Можете ли вы записать их? –

+0

Я написал несколько ;-) – queen3

ответ

2

Настройка литерал объекта возможных действий:

var actions = { 
    action1: function(elem) { 
    // If you just want to submit the form normally 
    $(elem).closest('form').submit(); 
    ... 
    }, 
    action2: function(elem) { 
    // If you wanted to ajax load a url-field into a div 
    var url = $('#url_field').val(); 
    $('.display').load(url); 
    ... 
    } 
} 

Затем написать селектор, который захватывает все кнопки (быть как вам нужно быть) и прикрепить каждую функцию на основе идентификатора элемента к обработчик кликов. Используя делегирование событий ('$ .live()'), вы можете увеличить производительность для случая, когда есть несколько кнопок или когда кнопки добавляются динамически.

$('input[type=button]').live('click', function(e){ 
    actions[$(this).attr('id')](this); 
}); 

Это назвали бы смежный действие в переменной «действия» на каждый клик (вероятно, вы должны подтвердить, что функция существует, а).

Внутри каждой из функций действия вы можете отправлять разные URL-адреса или отправлять ajax или загружать новую информацию или делать что-либо, что хотите. Что касается «repost [ing] form», это будет серверная функция, которая предварительно заполняла каждый элемент ввода своим предыдущим значением, подобно тому, как вы делали бы с недопустимым представлением.

Это дает вам одну строку кода для обработки событий, а затем чистую структуру для построения каждого из ваших действий в

3

Редко упоминается способ заключается в использовании ActionMethodSelectorAttribute:.

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

Короче говоря, он работает так же, как и атрибут AcceptVerbs - только он выбирает метод по представлению значения, а не по методу HTTP. Он также может использоваться для многих других целей, например, для выбора различных действий для запросов AJAX/HTTP и т. Д., Запрошенных форматов (JSON/XML/etc) и т. Д.

Какой способ использовать - переключатель, атрибуты и т. Д. - зависит от ситуации. Я бы не сказал, что здесь есть лучшая практика.

Просто методы имен я знаю:

  1. переключатель (/ параметр действия/отправить) {} - тоже prodecure, хотя можно использовать отражение как this.GetType() GetMethod (подать).. Invoke (это новый объект [] {actiondata}). .
  2. JavaScript: входные OnClick = "$ (это) .parents (" форма "). Атр (" действие», "конкретный URL") отправить() - не будет работать без яваскрипта
  3. ActionMethodSelectorAttribute - слишком декларативный .

Я был бы рад видеть лучший метод, например, атрибут [SubmitName («submit1»)] на действия, и OnActionExecuting() проверять его и отменяя действие под названием ... но я не» Я знаю, как это возможно.

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