多页面/形式mvc Web应用程序的最佳实践

时间:2013-06-18 20:20:47

标签: asp.net-mvc asp.net-mvc-3

我有一个使用ASP.Net MVC& amp;的项目。 EF5。模型具有足够多的字段,应用程序需要多个页面来收集所有数据。

收集数据后,将其提交给Web Service / WebAPI。 (这不能改变,或者我会使用EF实体)。

在填充数据模型时,将页面之间的数据模型持久化的最佳实践或最佳建议是什么?

3 个答案:

答案 0 :(得分:9)

您可以创建一个每个页面使用的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。这是我以前成功使用的一个:

https://github.com/mstratman/jQuery-Smart-Wizard

答案 1 :(得分:9)

问题 - 1

  

为什么我不能使用Domain Model直接与View或Why进行交互   我无法创建View Model并传递所有Properties   Domain-Model

<强>答案

假设你班上有50个字段。我已经实现了数据注释,因此必填字段也存在。好。我在步骤1。我提交了表格。我的 Post Action Method 说,表格无法提交!!!!为什么???

这是因为有一些必填字段不属于第1步的部分。我有一个问题。你想在其他答案中提及所有Properties吗? 如果要在一个View-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也适用于新的标签/ Windows ,就像Session变量一样。

您也可以使用Session变量,您也可以在控制器/区域之间保留数据

希望这篇文章可以帮到你。

答案 2 :(得分:0)

我实际上碰到了这篇文章,该文章非常有帮助,对我有帮助: https://blacklineit.com/2015/10/14/rolling-your-own-viewstate-in-asp-net-mvc/

基本上,本文归结为:“我发现在页面之间持久保存数据的最简单,最干净的方法是使用强大的Newtonsoft JSON库将viewmodel序列化为单个隐藏字段,并根据POST请求反序列化。”

阅读以获取背景和其他信息。