Как получить значения формы из HTTPPOST, словаря или? - PullRequest
106 голосов
/ 23 февраля 2011

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

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

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

Вопрос

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

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

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

Ответы [ 4 ]

144 голосов
/ 23 февраля 2011

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

[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 ...
}
100 голосов
/ 23 февраля 2011

Просто вы можете использовать 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;
}
36 голосов
/ 18 сентября 2013

Ответы очень хорошие, но в последней версии 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?" />

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

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

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

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

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

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

и ваш контроллер (Razor Engine) перехватит переменную формы «variableName» (имя такое, как вам нравится, но не изменяйте его) и попытайтесь создать его и привести к MyModel.

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

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

СОВЕТ: имя параметра в контроллере - это имя, определенное в разметке HTML "name =" не имя модели, а имя ожидаемой переменной в!


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

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

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

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

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

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

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

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

А код просто должен использовать IEnumerable и вызывать ToList()

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

Рекомендуется использовать одну модель или ViewModel (модель, объединяющую другие модели для создания сложной модели 'View') на страницу. Смешивание и сопоставление, как предлагается, может считаться плохой практикой, но до тех пор, пока оно работает и читаемо, это не ПЛОХО. Тем не менее, он демонстрирует мощность и гибкость двигателя Razor.

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

15 голосов
/ 04 ноября 2015

Если вы хотите получить данные формы непосредственно из запроса 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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...