Ответы очень хорошие, но в последней версии 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, если не отмечен. Однако требование состоит в том, что эти определенные переменные ДОЛЖНЫ существовать (если не допускают значения 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 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, или вы просто не хотите создавать свои собственные помощники, для одной формы, которая использует некоторую необычную комбинацию данных, вы можете быстро использовать эти методы, чтобы принять дополнительные данные.