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