Как передать IEnumerable Model в параметре Html.ActionLink

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