Моей целью является изменение модели в нескольких режимах. Так как иногда мои модели имеют много свойств, я хочу изменить их в нескольких режимах. Что-то вроде:редактирование модели более чем в одном представлении
первой страница редактирует 2 свойства, вторые правки 3 других свойств, ...
модель выглядит следующим образом:
public class LoadViewModel
{
public int CurrentPage { get; set; } = -1;
public PageViewModel PageViewModel { get; set; }
}
public class PageViewModel
{
public string Param1 { get; set; }
public string Param2 { get; set; }
public int Param3 { get; set; }
}
мой взгляд на индексе-странице выглядит следующим образом :
@model LoadViewModel
@using(Ajax.BeginForm("Load", "Home", new AjaxOptions {UpdateTargetId = "page"}, new {lvm = Model}))
{
<div id="page"></div>
<input type="submit"/>
}
и это мое действие:
public ActionResult Load(LoadViewModel lvm = null)
{
if (lvm == null) lvm = new LoadViewModel();
lvm.CurrentPage += 1;
TempData["CurrentPage"] = TempData["CurrentPage"] == null ? 0 : (int)TempData["CurrentPage"] + 1;
if (!partialViewDict.ContainsKey((int) TempData["CurrentPage"]))
TempData["CurrentPage"] = 0;
return PartialView(partialViewDict[(int)TempData["CurrentPage"]], lvm);
}
страницы просто обертоны, которые сопоставляются:
private Dictionary<int, string> partialViewDict = new Dictionary<int, string>
{
{0, "Pages/_Page1"},
{1, "Pages/_Page2"},
{2, "Pages/_Page3"},
};
и спроектированные так:
@using WebApplication1.Controllers
@model LoadViewModel
@{
TempData["CurrentPage"] = 0;
}
@Html.DisplayNameFor(m => m.PageViewModel.Param1)
@Html.EditorFor(m => m.PageViewModel.Param1)
это работает. При переключении на страницу 2 модель правильно установлена, но при попадании в submit
значение Param1
(установленное на странице 1) сбрасывается до null
, и только значения, установленные в текущей частичной части, являются правильными.
Это Страница2:
@using WebApplication1.Controllers
@model LoadViewModel
@{
TempData["CurrentPage"] = 1;
}
@Html.DisplayNameFor(m => m.PageViewModel.Param2)
@Html.EditorFor(m => m.PageViewModel.Param2)
Когда я добавить @Html.HiddenFor(m => m.PageViewModel.Param1)
в частичное, значение все еще установлен. Но я не хочу, чтобы значения были сброшены. Я не хочу добавлять @Html.HiddenFor
для всех свойств, заданных в предыдущем представлении. Как я могу предотвратить сброс значений при нажатии submit
без добавления @Html.HiddenFor
для всех не перечисленных атрибутов? Или есть ли другая возможность поймать мою цель?
hmm .. так что, возможно, создавая viewmodel для каждого шага, а затем позже сопоставьте их с одним, если последний шаг будет отправлен? (Я могу сохранить их только в базу данных, если был отправлен последний шаг). Если есть 2 человека, они не будут переопределять объект TempData от другого пользователя? –
Совсем нет. 'Session' /' TempData' специфичен для клиента. На клиенте установлен файл cookie, который уникально идентифицирует их данные сеанса. –
mhh okay, и у вас есть идея, если это может быть проблемой производительности для хранения большой viewmodel в таких TempData? (возможно, 50 объектов с большими строками). Поэтому при отправке я мог отображать модель просмотра страницы в большую модель просмотра (например, AutoMapper), которая может быть сохранена в базе данных, когда пользователь закончит все. Будет ли это хорошей процедурой? –