2012-05-22 2 views
0

У меня есть одна форма на моей странице с двумя способами ее отправки. Первый - это якорный тег, а другой - кнопка отправки, причем оба они имеют разные типы поведения.ASP.Net MVC 3 multiple submit

Как назначить каждому отдельный метод действий? Благодарю.

+1

Вы можете использовать javascript для изменения метода действия перед отправкой. –

ответ

2

Это действительно зависит от того, что делает якорный тэг - предположительно, это запускает отправку в javascript?

Если это на самом деле просто GET вместо POST, то вы можете сделать то, что предлагает @dbaseman - иметь отдельные методы действий для двух типов запросов.

Но если якорь действительно представить JavaScript, то я бы предпочел, чтобы просто дать кнопку отправки имя, так что вы можете обнаружить его на сервере в одном методе действий, а затем раскошелиться код оттуда:

<submit name="fromButtom" value="Submit" /> 

и тогда ваш метод действия:

public ActionResult Foo(string fromButton) 
{ 
    //if 'fromButton' contains 'Submit' then you assume it was the button. 
} 

Даже лучше вы можете использовать вместо <button>, а затем вы можете развестись отображаемый текст от значения, что кнопка (вносит представление полезно, если вы локализовать страницу) :

<button name="submitMethod" value="fromButton">Submit</button> 

Теперь вы можете иметь параметр submitMethod на вашем методе действия, в котором вы смотрите на 'fromButton'.

В любом случае - якорный тег/javascript (если это так) вы не представите это значение, потому что значение кнопки отображается только при нажатии.

+0

Отлично, я могу использовать это решение, однако я использую значение в кнопке отправки в качестве моего отображаемого текста, и я не хочу полагаться на него в своем коде. Я использую пользовательский html-помощник следующим образом: – ancdev

1

Просто используйте MVC HttpPost и HttpGet атрибуты различных версий ваших действий:

[HttpPost] 
public ActionResult FormAction(Model model, string method = post) { ... } 

[HttpGet] 
public ActionResult FormAction(Model model) { ... } 
+0

Здесь вы можете изменить имена методов, которые не будут компилироваться.Вам нужны разные имена методов и '[ActionName]' там :) –

+0

@AndrasZoltan, если я не потеряю его (предоставлено полностью возможно, так как это 2am здесь), что должно быть выполнено. Что вы видите как проблему? – McGarnagle

+0

lol - Я был там! Оба метода имеют одинаковое имя и идентичные параметры; то есть они являются дубликатами :) –

0

Если методы абсолютно разные, вы должны использовать JavaScript, чтобы заставить их действовать по-другому. С помощью JQuery, например, это будет выглядеть так:

$("#sbutton").click(function() { 
    alert("Submit button clicked!"); 
    // Do whatever you need - validate/initialize-fields/etc. 
    return false; // This is required to prevent normal form submit 
}); 

$("#slink").click(function() { 
    alert("Link clicked!"); 
    // Do whatever you need - validate/initialize-fields/etc. 
    return false; // This is required to prevent normal form submit 
}); 
0

Просто добавить еще одно решение, если вы хотите создать что-то, что будет работать с JavaScript выключен, и это не удобно менять имена и значения кнопок, то вы можете попробовать это я использовал в производственном коде.

Создать помощник, как это:

using System; 
using System.Reflection; 
using System.Web.Mvc; 

namespace Whatever 
{ 
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public class MultipleSubmitAttribute : ActionNameSelectorAttribute 
    { 
     public string Name { get; set; } 
     public string Argument { get; set; } 

     public override bool IsValidName(ControllerContext controllerContext, 
     string actionName, MethodInfo methodInfo) 
     { 
      bool isValidName = false; 
      string keyValue = string.Format("{0}:{1}", Name, Argument); 
      var value = controllerContext.Controller.ValueProvider.GetValue(keyValue); 
      if (value != null) 
      { 
       value = new ValueProviderResult(Argument, Argument, null); 
       controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument; 
       isValidName = true; 
      } 

      return isValidName; 
     } 
    } 
} 

и теперь в вашей форме вы можете сделать такую ​​вещь:

<input type="submit" name="action:DoSomething" value="Do something" /> 
<input type="submit" name="action:DoSomethingElse" value="Do something else" /> 

И тогда в вашем контроллере вы можете украсить свой метод действия, как это :

[HttpPost] 
[MultipleSubmit(Name = "action", Argument = "DoSomething")] 
public ActionResult DoSomething(ViewModel vm) 
{ ... } 

[HttpPost] 
[MultipleSubmit(Name = "action", Argument = "DoSomethingElse")] 
public ActionResult DoSomethingElse(ViewModel vm) 
{ ... } 
+0

Это решение отлично поработало бы, если бы у меня было две кнопки вместо тега и кнопка – ancdev

+0

Да, я просто подумал, что это может пригодиться для будущего использования. Кроме того, вы можете отправить его из тега '', используя javascript следующим образом: 'onclick = '$ (this) .parents (' form '). Submit(); return false;" ' –