在多个视图中编辑模型

时间:2016-10-12 12:26:20

标签: c# ajax asp.net-mvc

我的目标是修改多个视图中的模型。 因为有时我的模型有很多属性我想在多个视图中修改它们。类似的东西:

第一页编辑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,我该如何防止重置值?或者还有其他可能性来抓住我的目标吗?

2 个答案:

答案 0 :(得分:1)

这有两件事。首先,帖子本身,并得到验证。为此,每个步骤都应该有自己的视图模型,只包含它应该修改的属性。这允许您添加所需的所有验证,而不会导致其他步骤失败。最后,您将所有这些数据合并到您的实体类或其他任何内容中。

这将我们带到了第二部分。您需要某种方法来保持每个步骤的数据。 POST后唯一存在的数据是发布的数据和会话中的任何内容(包括TempData)。你总是可以创建一堆隐藏的字段来存储前面步骤中的数据,但这可能会有点困难。最有可能的是,您只想使用会话。

TempData基本上是Session的专用实例,因此您使用它并不重要。使用TempData,您需要记住为每个步骤设置的每个密钥的TempData.Keep(),或者您将在下一个请求中丢失之前的步骤。 Session会在会话期间保留它们,但您应该记得使用Session.Remove()删除最后的密钥。

答案 1 :(得分:0)

你在.cshtml中使用@using(Html.BeginForm())吗?

不幸的是这是MVC。 MVC是无状态的,这意味着如果你不渲染它然后你松开它:(

如果您使用模型绑定和脚手架,那么您可以节省一些时间和工作,但最后它将是相同的解决方案。