Несколько кнопок отправки в MVC3 - FormCollection не имеет ключа / значения для типа ввода Отправить - Проблема удаленной проверки? - PullRequest
0 голосов
/ 17 августа 2011

У меня есть две кнопки в приложении MVC3.

   <input type="submit" name="command" value="Transactions" />  &nbsp;
   <input type="submit" name="command" value="All Transactions" />

Когда я нажимаю на кнопку, она отправляет обратно правильно, но у FormCollection нет «командных» клавиш.Я также добавил свойство "команда" в модель, и его значение равно нулю при публикации формы.

public ActionResult Index(FormCollection formCollection, SearchReportsModel searchReportsModel).         {
            if (searchReportsModel.command == "All Transactions")
              ...
            else
              ....
        }

Я использую IE8.Как я могу использовать несколько кнопок в MVC3?Есть ли решение этой проблемы?Я провел много исследований и не смог найти решение.
Обновление:

Дэйв: Я попробовал ваше решение и выдает ошибку Http 404 "Ресурс не найден".

Вот мой код:

[HttpPost]
[AcceptSubmitType(Name = "Command", Type = "Transactions")]
public ActionResult Index(SearchReportsModel searchReportsModel)
{
    return RedirectToAction("Transactions", "Reports", new { ...});
}

[HttpPost]
[ActionName("Index")]
[AcceptSubmitType(Name = "Command", Type = "All Transactions")]
public ActionResult Index_All(SearchReportsModel searchReportsModel)
{
   return RedirectToAction("AllTransactions", "Reports", new { ... });
}

public class AcceptSubmitTypeAttribute : ActionMethodSelectorAttribute
    {
        public string Name { get; set; }
        public string Type { get; set; }

        public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
        {
            return controllerContext.RequestContext.HttpContext
                .Request.Form[this.Name] == this.Type;
        }
    }

Проблема была решена после комментирования следующего атрибута удаленной проверки в ViewModel (SearchReportsModel).Похоже, что это ошибка в MVC3:

  //[Remote("CheckStudentNumber", "SearchReports", ErrorMessage = "No records exist for this Student Number")]
  public int? StudentNumber { get; set; }

Ответы [ 5 ]

5 голосов
/ 17 августа 2011

Возможно, вам удастся использовать атрибут ActionMethodSelectorAttribute и переопределить метод IsValidForRequest. Ниже вы можете увидеть, что этот метод просто определяет, соответствует ли конкретный параметр (Name) одному из его свойств (Type). Следует связать с моделью представления, которая выглядит следующим образом:

public class TestViewModel
{
    public string command { get; set; }
    public string moreProperties { get; set; }
}

Атрибут может выглядеть так:

public class AcceptSubmitTypeAttribute : ActionMethodSelectorAttribute
{
    public string Name { get; set; }
    public string Type { get; set; }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return controllerContext.RequestContext.HttpContext
            .Request.Form[this.Name] == this.Type;
    }
}

Затем вы можете пометить свои действия атрибутом AcceptSubmitType следующим образом:

[AcceptSubmitType(Name="command", Type="Transactions")]
public ActionResult Index(TestViewModel vm) 
{
    // use view model to do whatever
}

// to pseudo-override the "Index" action
[ActionName("Index")]
[AcceptSubmitType(Name="command", Type="All Transactions")]
public ActionResult Index_All(TestViewModel vm) 
{
    // use view model to do whatever
}

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

1 голос
/ 17 августа 2011

Поправьте меня, если я не прав, но в соответствии со стандартом W3C у вас должна быть только 1 кнопка отправки на форму.Также иметь два элемента управления с одинаковыми именами - плохая идея.

0 голосов
/ 09 ноября 2011

@ CodeRush: стандарт W3C позволяет разрешать более 1 отправки на форму. http://www.w3.org/TR/html4/interact/forms.html. «Форма может содержать более одной кнопки отправки».

0 голосов
/ 17 августа 2011

Это хороший блог об этом найденном здесь

Мне нравится, как выглядит добавление в AcceptParameterAttribute

0 голосов
/ 17 августа 2011

когда вы отправляете (на любую кнопку) всю вашу страницу, отправленную обратно в действие контроллера, у меня возникла та же проблема, но я еще не нашел достойного решения ... возможно, вы могли бы работать с методом javascript 'onclick' и установить скрытое значение 1 для первой кнопки и 0 для второй кнопки или что-то в этом роде?

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