【问题标题】:MVC creating multiple objects from single viewMVC 从单个视图创建多个对象
【发布时间】:2014-03-27 09:12:27
【问题描述】:

为了清楚起见,我的问题是如何使用单个视图创建多个对象。我的 ViewModel 工作正常,我可以显示多个对象没问题

.NET 编码之间已经有一段时间了(上次我在 2.0 中编码)。我创建了一个 MVC 4 项目并成功创建了一个 ViewModel(在来自多个对象的单个视图上显示数据)。

但是,我作弊了。我直接填充了数据库。我现在正面临一个相反的问题,从一个视图创建多个对象的最佳做法是什么?

在我的示例中,我有一个 User,他有一个 userIduserIdUserDetails 中的外键。

只是想重新投入其中并想知道你们在做什么?

【问题讨论】:

  • 你已经用 ViewModel 标记了你的问题...我就是这样做的!
  • 您的视图模型将所有相关信息从您的视图传送到您的控制器,您的控制器从视图模型中的数据填充您的各种 DTO 并与数据库通信。任务完成。根据需要在控制器和数据库之间添加额外的抽象层。

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-viewmodel


【解决方案1】:

MVC中有6种方式传递多个对象

  1. 视图模型
  2. 局部视图
  3. 查看包
  4. 查看数据
  5. 临时数据
  6. 元组

每个人都有自己的优点和缺点。你必须根据你手头的问题来决定。 更多信息可以参考代码项目文章:How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC

让我给出 View Model 的优点和缺点

视图模型: 优势

  • ViewModel 允许我们在一个视图中呈现多个模型类型作为 单一模型。
  • 强大的智能感知支持和视图上的编译时错误检查 页面。
  • ViewModel 也适用于安全目的,因为视图只有什么 他们正是需要。核心域模型不向用户公开。
  • 如果核心域模型有任何变化,你不需要 查看代码中的任何地方更改,只需要修改相应的 视图模型。

缺点

  • ViewModels 在 Models 和 Views 之间添加了另一层,因此它增加了 复杂一点。所以对于小型和演示应用程序,我们 可以使用元组或其他方式来保持简单的演示。

【讨论】:

    【解决方案2】:

    选项 1: 最好的方法是在 Model 或 ViewModel 中使用强类型视图。

    例如,您有两个类UserEducation,您想在视图中显示用户的所有教育详细信息,您可以创建自定义视图模型并将其传递给视图,您的视图是强类型的查看模型:

    public class User
    {
    
    public int UserId {get;set;}
    public string UserName {get;set}
    -------
    ------
    }
    
    public class Education
    {
    public int UserId {get;set;}
    public int DegreeId {get;set;}
    public long Marks {get;set;}
    ---------------
    --------------
    }
    

    现在像这样创建一个视图模型:

    public class EducationViewModel
    {
    
    public User user {get;set;}
    public List<Education> educationList {get;set;}
    }
    

    现在将 ViewModel 传递给 View 并在 View 中执行此操作:

    @model AppNameSpace.ViewModels.EducationViewModel
    

    提示:创建一个名为 ViewModels 的文件夹并将所有视图模型类放入其中。

    选项2: 选项 2 是用户 ViewBag 并将多个对象从控件传递到您的视图,当您在控制器中设置一些值时可以访问 ViewBag,您可以在视图中访问那个动作,之后它会被自动清除,如果你再次访问它,它就会为空。

    你可以像这样使用 ViewBag:

    ViewBag.Message = "Using ViewBag";
    

    并在视图中读取这样的值:

    string Message = ViewBag.Message as string;
    

    选项 3:

    方案3是将数据存储在TempData中,它一次只读,意味着你在其中设置了值,当你读取它时,它会自动删除,TempData内部使用会话变量。你可以使用像这样的临时数据:

    TempData["Key"] = "value";
    

    现在你在视图中阅读它:

    string val = TempData["Key"] as string;
    

    阅读后会自动删除,但如果你需要它,你可以像这样保留它:

    TempData.Keep("Key");
    

    【讨论】:

    • 谢谢,这是为了显示数据,而不是创建对象。
    • 实际上在视图中创建多个对象是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2012-11-21
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多