【问题标题】:ASP.NET MVC4: How to pass a view model and other data to the viewASP.NET MVC4:如何将视图模型和其他数据传递给视图
【发布时间】:2012-12-12 16:30:49
【问题描述】:

我创建了一个名为 DashboardViewModel 的 ViewModel:

public class DashboardViewModel
{        
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }      
}

我将 ViewModel 传递给 ActionResult 中的视图。但我也需要传递其他东西。这是我的 ActionResult:

public ActionResult Index()
{

    HardwareType hwt = new HardwareType { HType = "PC" };
    IEnumerable<Hardware> Pcs = db.Hardware.Where(h => h.HardwareType.Contains(hwt));

    DashboardViewModel dvm = new DashboardViewModel();   

    return View(dvm);
}

如果我已经在传递dvm,如何将Pcs 传递给视图?我什至不知道这是否是正确的方法。我想要完成的是在页面上创建导航。因此,我不仅将拥有个人电脑,而且还将拥有显示器和打印机以传递给视图,以及软件。这是我的硬件类:

public class Hardware
{
    public int Id { get; set; }
    public virtual ICollection<DeviceType> Type { get; set; }
    public string AssetTagId { get; set; }
    public virtual ICollection<Manufacturer> Manufacturer { get; set; }
    [Required]
    [StringLength(50)]
    public string ServiceTagId { get; set; }
    [Required]
    [StringLength(50)]
    public string SerialNumber { get; set; }
    [Required]
    [StringLength(75)]
    public string ProductNumber { get; set; }
    // [Required]
    [StringLength(20)]
    public string PurchaseDate { get; set; }
    [StringLength(20)]
    public string WarrantyExpiration { get; set; }
    [Required]
    [StringLength(20)]
    public string WarrantyType { get; set; }
    public virtual ICollection<Location> Location { get; set; }
    public virtual ICollection<HardwareType> HardwareType { get; set; }
    [Required]
    [StringLength(2000)]
    public string Notes { get; set; }
    public string POATag { get; set; }
}

对于我想做的事情(使用各种硬件和软件创建导航)的最佳方法是什么?我是 MVC 的新手,正在尝试遵循有关做什么的建议,但我可以使用更高级别的方法,因为也许我正在处理这一切都是错误的。谢谢。

【问题讨论】:

  • 另外,Razor 的语法是什么?
  • 您的“HardwareType 类”是什么?

标签: asp.net-mvc-4 ef-code-first viewmodel


【解决方案1】:

您可以将您的Pcs 放入ViewBag or ViewData,如下所示:

public ActionResult Index()
{

    HardwareType hwt = new HardwareType { HType = "PC" };
    IEnumerable<Hardware> Pcs = db.Hardware.Where(h => h.HardwareType.Contains(hwt));
    ViewBag.Pcs=Pcs;//or ViewData["Pcs"]=Pcs;

    DashboardViewModel dvm = new DashboardViewModel();   

    return View(dvm);
}

ViewBag 是动态对象。您可以向其中添加任何内容。使用任何名称,例如你的Pcs也可以存储在ViewBagViewBag.AnyNameYouLike=Pcs;

**RAZOR SYNTAX:**

只需应用循环即可完成。

@foreach(var pc in ViewBag.Pcs)
{
  @pc.Id;//Will give you id

}

你可以像这样遍历所有属性

【讨论】:

  • 我试过这种方法,它告诉我它不知道 ViewBag.Pcs 是什么。
  • 它说它在当前上下文中不存在,尽管我认为@model CIT.ViewModels.DashbaordViewModel
  • 好的。感谢您的建议。
  • 这是编译器给我的信息:Unable to create a constant value of type 'CIT.Models.HardwareType'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
【解决方案2】:

创建一个顶级视图模型 - 就像您拥有 DashboardViewModel 一样 - 并将所有必要的模型添加为属性。

如果您为顶级视图模型中所需的每个业务模型创建了视图模型,那就太好了。

将业务对象自动映射到新的视图模型 - 参见AutoMapper 示例。这样,您只传递视图实际需要的信息。

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多