Как получить значения формы из HTTPPOST, словаря или?
У меня есть контроллер MVC, который имеет этот метод действия:
[HttpPost]
public ActionResult SubmitAction()
{
// Get Post Params Here
... return something ...
}
Форма представляет собой нетривиальную форму с простым текстовым полем.
Вопрос
Как мне получить доступ к значениям параметров?
Я не публикую сообщения из представления, пост приходит извне. Я предполагаю, что есть коллекция пар ключ / значение, к которым у меня есть доступ.
Я старался Request.Params.Get("simpleTextBox");
но он возвращает ошибку "Извините, при обработке вашего запроса произошла ошибка".
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 ...
}
Просто вы можете использовать FormCollection
лайк:
[HttpPost]
public ActionResult SubmitAction(FormCollection collection)
{
// Get Post Params Here
string var1 = collection["var1"];
}
Вы также можете использовать класс, который сопоставлен со значениями Form, и механизм asp.net mvc автоматически заполняет его:
//Defined in another file
class MyForm
{
public string var1 { get; set; }
}
[HttpPost]
public ActionResult SubmitAction(MyForm form)
{
string var1 = form1.Var1;
}
Ответы очень хорошие, но в последней версии 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 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. Приятно то, что вы можете смешивать и сочетать различные модели в разметке, и анализ обратной записи будет заполнять как можно больше. Вам не нужно определять модель на странице или использовать каких-либо помощников.
СОВЕТ: Имя параметра в контроллере - это имя, определенное в разметке 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">
Индекс в списке<> ДОЛЖЕН всегда быть нулевым и последовательным. 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 (модель, объединяющую другие модели для создания сложной модели 'View') на страницу. Смешивание и сопоставление, как предлагается, может считаться плохой практикой, но до тех пор, пока оно работает и читаемо, это не ПЛОХО. Тем не менее, он демонстрирует мощность и гибкость двигателя Razor.
Поэтому, если вам нужно добавить что-то произвольное или переопределить другое значение из помощника Razor, или просто не хотите создавать собственных помощников для одной формы, которая использует какую-то необычную комбинацию данных, вы можете быстро использовать эти методы, чтобы принять дополнительные данные.
Если вы хотите получить данные формы непосредственно из запроса 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]);
}