Как получить значения формы из 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"]; }
вы также можете использовать класс, который сопоставляется со значениями формы, и asp.net MVC engine автоматически заполняет его:
//Defined in another file class MyForm { public string var1 { get; set; } } [HttpPost] public ActionResult SubmitAction(MyForm form) { string var1 = form1.Var1; }
ответы очень хороши, но в последнем выпуске MVC и .NET есть еще один способ, который мне очень нравится использовать, вместо "старой школы" FormCollection и ключей запроса.
рассмотрим фрагмент HTML, содержащийся в теге формы, который либо выполняет AJAX, либо публикует форму.
<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, если он не установлен. Требование, однако, заключается в том, что эти определенные переменные должны существовать (если только nullable(помните, что
string
обнуляется)) в противном случае AJAX или POST back не удастся.[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<>
для ненулевых и не последовательных индексов post back. Нужно добавить дополнительные скрытые поля ввода, чтобы помогите связующему.<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 (модель, объединяющую другие модели для создания сложной модели "вид") на странице. Смешивание и сопоставление, как предлагается, можно считать плохой практикой, но пока она работает и читается, это не плохо. Однако он демонстрирует мощность и гибкость бритвенного двигателя.
так что если вам нужно отбросить что-то произвольное или переопределить другое значение из помощника 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]); }