我的目标是修改多个视图中的模型。 因为有时我的模型有很多属性我想在多个视图中修改它们。类似的东西:
第一页编辑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)
这是有效的。当切换到Page2时,模型被正确设置,但是当点击submit
Param1
的值(我在Page1中设置)被重置为null
并且只有我设置的值当前部分是正确的。
这是Page2:
@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
,我该如何防止重置值?或者还有其他可能性来抓住我的目标吗?
答案 0 :(得分:1)
这有两件事。首先,帖子本身,并得到验证。为此,每个步骤都应该有自己的视图模型,只包含它应该修改的属性。这允许您添加所需的所有验证,而不会导致其他步骤失败。最后,您将所有这些数据合并到您的实体类或其他任何内容中。
这将我们带到了第二部分。您需要某种方法来保持每个步骤的数据。 POST后唯一存在的数据是发布的数据和会话中的任何内容(包括TempData
)。你总是可以创建一堆隐藏的字段来存储前面步骤中的数据,但这可能会有点困难。最有可能的是,您只想使用会话。
TempData
基本上是Session
的专用实例,因此您使用它并不重要。使用TempData
,您需要记住为每个步骤设置的每个密钥的TempData.Keep()
,或者您将在下一个请求中丢失之前的步骤。 Session
会在会话期间保留它们,但您应该记得使用Session.Remove()
删除最后的密钥。
答案 1 :(得分:0)
你在.cshtml中使用@using(Html.BeginForm())吗?
不幸的是这是MVC。 MVC是无状态的,这意味着如果你不渲染它然后你松开它:(
如果您使用模型绑定和脚手架,那么您可以节省一些时间和工作,但最后它将是相同的解决方案。