2013-08-19 3 views
1

я попытался реализации вариант объяснил в this article.Несколько различных кнопок отправки в одной форме

public class HttpParamActionAttribute : ActionNameSelectorAttribute 
{ 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase)) 
      return true; 

     if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase)) 
      return false; 

     var request = controllerContext.RequestContext.HttpContext.Request; 
     return request[methodInfo.Name] != null; 
    } 
} 

Мои действия контроллера:

[HttpParamAction] 
[HttpPost] 
public virtual ActionResult EditAccouncement(_AccouncementPostViewModel m) 

[HttpParamAction] 
[HttpPost] 
public virtual PartialViewResult DeleteAnnouncement(int id) 

Моя форма:

@using (Ajax.BeginForm("Action", ajaxOptions: new AjaxOptions() 
    { 
     HttpMethod = "POST", 
     InsertionMode = InsertionMode.Replace, 
     UpdateTargetId = "announcement" + @Model.id 
    })) 
{ 
      //form values omitted 
      <button type="submit" class="submitbutton" name="edit">Change details</button> 
      <button type="submit" class="submitbutton" name="delete">Delete</button> 
} 

Однако вызываемое действие контроллера по-прежнему остается только методом Action (которого не существует). Я что-то упускаю?

+0

Если ваши кнопки имеют «значение =„

+0

На основе примера методы действия следует переименовать в «Редактировать» и «Удалить», чтобы они соответствовали имени на кнопках. –

ответ

1

Ваша проблема вызвана несоответствием между вашими именами действий и атрибутами имени кнопки.

Значение имени атрибута на кнопках должна соответствовать именам действий, например, так:

<button type="submit" name="EditAccouncement">Change details</button> 
<button type="submit" name="DeleteAnnouncement">Delete</button> 

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

Вы можете так же легко использовать JavaScript (например, jquery) для обработки формы, которая отправляется вручную, путем подключения двух разных обработчиков событий к вашим кнопкам. Одно событие сделает POST для действия EditAccouncement (typo!), И вы сделаете POST для действия DeleteAnnouncement.

Я сделал макет на jsfiddle, который демонстрирует код: http://jsfiddle.net/wmWNj/3/

Update 2: фиксированные опечаток в jsfiddle

+0

Ах, конечно! Большое спасибо! –

+0

См. Мое обновление для альтернативного подхода – havardhu