Как получить значения формы из HTTPPOST, словаря или?

У меня есть MVC-контроллер, у которого есть этот метод действий:

[HttpPost]
public ActionResult SubmitAction()
{
     // Get Post Params Here
 ... return something ...
}

Форма представляет собой нетривиальную форму с простым текстовым полем.

Вопрос

Как мне получить доступ к значениям параметров?

Я не отправляю сообщение из представления, сообщение выходит извне. Я предполагаю, что есть набор пар ключ/значение, к которым я имею доступ.

Я пробовал Request.Params.Get("simpleTextBox");, но он возвращает ошибку "Извините, произошла ошибка при обработке вашего запроса".

95
23 февр. '11 в 11:18
источник поделиться
4 ответов

Вы могли бы заставить ваше действие контроллера взять объект, который будет отражать имена ввода формы, и связующее устройство по умолчанию автоматически создаст этот объект для вас:

[HttpPost]
public ActionResult SubmitAction(SomeModel model)
{
    var value1 = model.SimpleProp1;
    var value2 = model.SimpleProp2;
    var value3 = model.ComplexProp1.SimpleProp1;
    ...

    ... return something ...
}

Другой (очевидно, уродливый) способ:

[HttpPost]
public ActionResult SubmitAction()
{
    var value1 = Request["SimpleProp1"];
    var value2 = Request["SimpleProp2"];
    var value3 = Request["ComplexProp1.SimpleProp1"];
    ...

    ... return something ...
}
121
23 февр. '11 в 11:21
источник

Связанные вопросы


Похожие вопросы

Просто вы можете использовать FormCollection как:

[HttpPost] 
public ActionResult SubmitAction(FormCollection collection)
{
     // Get Post Params Here
 string var1 = collection["var1"];
}

Вы также можете использовать класс, который сопоставляется с значениями формы, а механизм asp.net mvc автоматически заполняет его:

//Defined in another file
class MyForm
{
  public string var1 { get; set; }
}

[HttpPost]
public ActionResult SubmitAction(MyForm form)
{      
  string var1 = form1.Var1;
}
93
23 февр. '11 в 11:23
источник

Ответы очень хорошие, но есть другой способ в последней версии MVC и .NET, которую я действительно люблю использовать, вместо клавиш "FormCollection и Request" старой школы.


Рассмотрим фрагмент HTML, содержащийся в теге формы, который либо выполняет AJAX, либо FORM POST.

<input type="hidden"   name="TrackingID" 
<input type="text"     name="FirstName"  id="firstnametext" />
<input type="checkbox" name="IsLegal"  value="Do you accept terms and conditions?" />

Контроллер фактически проанализирует данные формы и попытается доставить его вам в качестве параметров определенного типа. Я включил checkbox, потому что это сложно. Он возвращает текст "on", если он установлен, и null, если не установлен. Требование, однако, состоит в том, что эти определенные переменные ДОЛЖНЫ существовать (если не указано значение NULL (помните, что string имеет значение NULL)), в противном случае ошибка AJAX или POST завершится неудачно.

[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
    MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}

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

public Class MyModel
{
  public int HouseNumber { get; set; }
  public string StreetAddress { get; set; }
}

Разметка HTML будет просто...

<input type="text" name="MyHome.HouseNumber" id="whateverid" >

и ваш контроллер (Razor Engine) перехватит переменную формы "MyHome" и попытается ее создать и передать в MyModel.

[HttpPost]
public ActionResult PostBack(MyModel MyHome){
    postBack.HouseNumber; //The value user entered
    postBack.StreetAddress; //the default value of NULL.
}

Когда контроллер ожидает модель, вам не нужно определять ВСЕ поля, поскольку синтаксический анализатор просто оставит их по умолчанию, обычно NULL. Самое приятное, что вы можете смешивать и сопоставлять различные модели с маркером, а синтаксис post back будет заполняться как можно больше. Вам не нужно определять модель на странице или использовать какие-либо помощники.

СОВЕТ. Имя параметра в контроллере определяется именем в HTML-разметке "name=", а не название модели!


Использование List<> немного сложнее в его разметке.

<input type="text" name="MyHomes[0].HouseNumber" id="id"           value="0">
<input type="text" name="MyHomes[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="MyHomes[2].HouseNumber"                   value="2">
<input type="text" name="MyHomes[3].HouseNumber" id="whateverid22" value="3">

Index on List < > ДОЛЖЕН всегда быть нулевым и последовательным. 0,1,2,3.

[HttpPost]
public ActionResult PostBack(List<MyModel> MyHomes){
     int counter = MyHomes.Count()
     foreach(var home in MyHomes)
     { ... }
}

Использование IEnumerable<> для индексов с нулевым основанием и не последовательных индексов. Нам нужно добавить дополнительный скрытый ввод, чтобы помочь связующему.

<input type="hidden" name="MyHomes.Index" value="278">
<input type="text" name="MyHomes[278].HouseNumber" id="id"      value="3">

<input type="hidden" name="MyHomes.Index" value="99976">
<input type="text" name="MyHomes[99976].HouseNumber" id="id3"   value="4">

<input type="hidden" name="MyHomes.Index" value="777">
<input type="text" name="MyHomes[777].HouseNumber" id="id23"    value="5">

И для этого кода просто нужно использовать IEnumerable и вызвать ToList()

[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> MyHomes){
     int counter = MyHomes.ToList().Count()
     foreach(var home in MyHomes)
     { ... }
}

Рекомендуется использовать одну модель или ViewModel (модель, сопоставляющая другие модели для создания сложной модели "Просмотр" ) на страницу. Смешивание и сопоставление, как было предложено, можно считать плохой практикой, но до тех пор, пока он работает и читается, его не BAD. Тем не менее, он демонстрирует мощность и гибкость двигателя Razor.

Итак, если вам нужно отбросить что-то произвольное или переопределить другое значение из помощника Razor или просто не хотите, чтобы вы делали собственные помощники, для одной формы, которая использует необычную комбинацию данных, вы можете быстро использовать эти методы для приема дополнительных данных.

28
18 сент. '13 в 16:02
источник

Если вы хотите получить данные формы непосредственно из запроса Http без каких-либо привязок к модели или FormCollection, вы можете использовать это:

[HttpPost] 
public ActionResult SubmitAction() {

    // This will return an string array of all keys in the form.
    // NOTE: you specify the keys in form by the name attributes e.g:
    // <input name="this is the key" value="some value" type="test" />
    var keys = Request.Form.AllKeys;

    // This will return the value for the keys.
    var value1 = Request.Form.Get(keys[0]);
    var value2 = Request.Form.Get(keys[1]);
}
8
04 нояб. '15 в 21:11
источник

Посмотрите другие вопросы по меткам или Задайте вопрос