簡體   English   中英

在多個視圖中編輯模型

[英]editing a model in more than one view

我的目標是在多個視圖中修改模型。 由於有時我的模型具有許多屬性,因此我想在多個視圖中對其進行修改。 就像是:

第一頁編輯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時, 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 如何在不為所有未列出的屬性添加@Html.HiddenFor情況下@Html.HiddenFor submit時重置值? 還是有其他可能抓住我的目標?

這有兩部分。 首先,帖子本身,然后進行驗證。 為此,每個步驟都應具有自己的視圖模型,僅包含應修改的屬性。 這使您可以添加所需的所有驗證,而不會導致其他步驟失敗。 最后,您將把所有這些數據合並到您的實體類中。

這使我們進入第二篇。 您需要某種方式來保留每個步驟中的數據。 POST之后將僅有的數據是已發布的數據以及會話中的所有內容(包括TempData )。 您總是可以創建一堆隱藏字段來存儲前面步驟中的數據,但這可能會有些麻煩。 最有可能的是,您只想使用該會話。

TempDataSession的專用實例,因此您使用的並不重要。 使用TempData ,您需要記住為每個步驟設置的每個鍵調用TempData.Keep() ,否則在下一個請求時將丟失先前的步驟。 Session將在會話的整個生命周期中保持它們的存在,但是您應該記住最后使用Session.Remove()刪除密鑰。

您是否在.cshtml中使用@using(Html.BeginForm())?

不幸的是,這是MVC。 MVC是無狀態的,這意味着如果不渲染它,則將其釋放:(

如果使用模型綁定和腳手架,則可以節省一些時間和工作,但最后還是相同的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM