#asp.net-mvc #asp.net-mvc-3 #razor
#asp.net-mvc #asp.net-mvc-3 #razor
Вопрос:
У меня есть вопрос. Мне нужно сохранить все значения моей модели.
В index.cshtml у меня есть :
@модель IEnumerable
На мой взгляд, я могу получить все свои значения в foreach.
@foreach (переменный элемент в модели) { элемент.Идентификатор, элемент.Имя }
Но мне нужно передать всю мою модель моему контроллеру по ОДНОЙ ссылке :
html.actionlink(«Сохранить это», Save, …);
Как я могу это сделать, пожалуйста?
Спасибо
Ответ №1:
Вы не можете передать всю модель с запросом GET подобным этому. Вы могли бы использовать HTML-форму:
@using (Html.BeginForm("Save", "SomeController"))
{
@Html.EditorForModel()
<input type="submit" value="Save It">
}
где вы определили шаблон редактора для этой модели ( ~/Views/Shared/EditorTemplates/Item.cshtml
), который использует скрытые поля:
@model Item
@Html.HiddenFor(x => x.ID)
@Html.HiddenFor(x => x.Name)
Имя и расположение этого фрагмента важны. Он должен быть расположен в ~/Views/Shared/EditorTemplates
и имя файла должно быть вызвано Item.cshtml
, если Item является именем типа вашей коллекции моделей, т.е. IEnumerable<Item>
. Шаблон редактора будет выполнен для каждого элемента коллекции и отобразит соответствующие скрытые поля, которые позволят перенести его на сервер.
Эта форма успешно отправит коллекцию элементов следующему действию контроллера:
[HttpPost]
public ActionResult(IEnumerable<Item> model)
{
...
}
И вот альтернативный способ продолжить. Если пользователь не должен изменять значения модели в представлении, то вы могли бы просто использовать некоторый уникальный идентификатор, позволяющий повторно извлекать модель из того места, где вы ее извлекли изначально. Так, например:
public ActionResult Index(int id)
{
IEnumerable<Item> model = ... fetch the model using the id
return View(model);
}
и в представлении сгенерируйте ссылку, передающую этот идентификатор:
@Html.ActionLink("Save It", Save, new { id = "123" })
Комментарии:
1. Да, я думаю, я понял способ с формой. Но вы имеете в виду, что я могу получить все значения моей модели без
foreach
? Потому что для каждого элемента моей модели у меня есть некоторые значения. И ваш код, похоже, сохраняет только ОДИН элемент, нет?2. @Steffi, когда вы пишете,
@Html.EditorForModel()
и ваша модель являетсяIEnumerable<Item>
и у вас есть частичное~/Views/Shared/EditorTemplates/Item.cshtml
, это частичное будет выполнено для каждого элемента этой модели. Таким образом, он отобразит два скрытых поля для каждого элемента, и это позволит отправлять все на контроллер.3. Упс, у меня нет
~/Views/Shared/EditorTemplates/Item.cshtml
… Я использую простое представление.4. Есть ли другой способ? Пожалуйста
5. @Steffi, возможно, но это то, что я лично считаю хорошей практикой, поэтому я предпочитаю предлагать этот метод.