![](/img/trans.png)
[英]How to connect more than one model or more than one view model in a single razor view?
[英]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
)。 您總是可以創建一堆隱藏字段來存儲前面步驟中的數據,但這可能會有些麻煩。 最有可能的是,您只想使用該會話。
TempData
是Session
的專用實例,因此您使用的並不重要。 使用TempData
,您需要記住為每個步驟設置的每個鍵調用TempData.Keep()
,否則在下一個請求時將丟失先前的步驟。 Session
將在會話的整個生命周期中保持它們的存在,但是您應該記住最后使用Session.Remove()
刪除密鑰。
您是否在.cshtml中使用@using(Html.BeginForm())?
不幸的是,這是MVC。 MVC是無狀態的,這意味着如果不渲染它,則將其釋放:(
如果使用模型綁定和腳手架,則可以節省一些時間和工作,但最后還是相同的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.