我有一个使用 ASP.Net MVC & EF5 的项目。模型有足够多的字段,应用程序需要几个页面来收集所有数据。
收集数据后,将其提交给 Web 服务/WebAPI。(这无法更改,否则我将使用 EF 实体)。
在填充数据模型时,将数据模型逐页保存的最佳实践或最佳建议是什么?
我有一个使用 ASP.Net MVC & EF5 的项目。模型有足够多的字段,应用程序需要几个页面来收集所有数据。
收集数据后,将其提交给 Web 服务/WebAPI。(这无法更改,否则我将使用 EF 实体)。
在填充数据模型时,将数据模型逐页保存的最佳实践或最佳建议是什么?
您可以创建一个每个页面使用的 ViewModel 类(强类型视图),并将未编辑的字段存储在隐藏字段中。您的控制器将为每个步骤提供一个操作方法和视图。提交每个步骤后,您将返回视图(连同视图模型)以进行下一步。
在最后一页,您提交视图模型并保存它。
控制器代码:
[HttpPost]
public ActionResult Step1(MyBigViewModel model)
{
//do work
return View("Step2", model);
}
[HttpPost]
public ActionResult Step2(MyBigViewModel model)
{
//do work
return View("Step3", model);
}
[HttpPost]
public ActionResult Step3(MyBigViewModel model)
{
//save here
return View("Success", model);
}
另一种选择是在单个页面上使用“类似向导”的 UI。这是我以前成功使用过的一个:
问题 - 1
为什么我不能使用
Domain Model
直接与 View 交互或为什么我不能创建View Model
并传递Properties
所有Domain-Model
?
回答
假设您的班级中有 50 个字段。我已经实现了数据注释,所以必填字段也存在。行。我在第 1 步。我提交了表格。我的Post Action Method说,Form 不能提交!!!为什么???
这是因为有些必填字段不是第 1 步的一部分。我有一个问题要问你。您愿意Properties
在其他答案中保留所有内容吗?如果您想将所有属性添加到一个中,View-Model
那么为什么要根据其他答案中提供的建议直接与 Domain-Model 交互?因此,在一个 View-Model 中添加所有属性将是最糟糕的。对?
问题2
在填充数据模型时,将数据模型逐页保存的最佳实践或最佳建议是什么?
回答
1. Use View Models with necessary properties only(that are required for
particular Step.). So there can be many View Models on the basis of
your Steps. This process will be very useful in long run
2. Use AutoMapper to populate the info required for View Model from Domain Model.
使用Strongly Types View Models
,一旦数据被发送到Post Action Method
之后据我所知,您可以使用它TempData
来存储发布的数据。这就像一个DataReader Class
,一旦读取,数据就会丢失。这样存储的数据在TempData
读取后将变为空。
var Value = TempData["keyName"] //Once read data will be lost
问题 - 3
模型有足够多的字段,应用程序需要几个页面来收集所有数据。
回答
因此,即使在读取数据后也要保留数据,您可以Alive
像下面这样
var Value = TempData["keyName"];
TempData.Keep(); //Data will not be lost for all Keys
TempData.Keep("keyName"); //Data will not be lost for this Key
问题 - 4
How will you handle the case when you have both Next and Previous Buttons?
回答
TempData
也可以在新选项卡/窗口中使用,就像Session
变量一样。
您也可以使用Session
变量,您也可以跨控制器/区域保存数据
希望这篇文章对你有很大帮助。
我实际上遇到了这篇文章,它提供了很多信息并帮助了我: https ://blacklineit.com/2015/10/14/rolling-your-own-viewstate-in-asp-net-mvc/
基本上这篇文章归结为:“我发现在页面之间保存数据的最简单和最干净的方法是使用伟大的 Newtonsoft JSON 库将视图模型序列化为单个隐藏字段,并在 POST 请求上反序列化。”
阅读它以获取背景和其他信息。