【问题标题】:multiple models to partial view多个模型到局部视图
【发布时间】:2012-08-28 18:13:59
【问题描述】:

我正在自学asp .net mvc3。

我有一个使用各种模型和查找类型 db 的局部视图。我想保持它的强类型并在多个地方使用它,但我不知道如何实现它。 下面的例子应该更好地解释它。这个问题可能会有点长,感谢您的耐心等待。

局部视图基本上给出了属性的小描述。 “_PropertyExcerptPartial”的 sn-p 如下:

@model Test.ViewModels.PropertyExcerptViewModel

<div>
    <h3>@Html.DisplayFor(model => model.Property.NoOfBedrooms) bedroom @Html.DisplayFor(model => model.FurnitureType.FurnitureTypeDescription) flat to Rent </h3>
…
</div>

我想保持这个局部视图的强类型,并在多个地方使用它。强类型化的模型如下:

public class PropertyExcerptViewModel
{
    public Property Property { get; set; }
    public FurnitureType FurnitureType { get; set; }
}

本模型查找的二二数据库如下:

 public class Property
 {
    public int PropertyId {get; set; }       
    ...
    public int NoOfBedrooms {get; set;}
    public int FurnishedType { get; set; }
    ...
 }

public class FurnishedType
{
    public int FurnishedTypeId { get; set; }
    public string FurnishedTypeDescription { get; set; }
}

家具型数据库基本上只是一个包含以下数据的查找表: 1 - 带家具 2 - 没有家具 3 - 部分家具 4 - 面议

我有很多这样的查找,因为我只在属性数据库中存储了一个 int 值,可用于查找描述。这些数据库没有链接到属性数据库,家具类型的值是通过函数 GetFurnitureType(id) 读取的。我将 Property.FurnitureType 的存储 int 值作为 id 传递。

但是,当我尝试使用此局部视图时遇到问题,因为我不确定如何将这些多个模型从一个视图传递到局部视图。

假设我正在尝试创建一个“添加的属性”页面。这个页面基本上列出了登录用户添加的属性。为此,我创建了另一个名为 GetAddedProperties(userId) 的函数,它返回由特定用户添加的属性。在“添加的属性”视图中,我可以调用一个 foreach 函数来循环通过 GetAddedProperties 返回的所有属性并显示 _PropertyExcerptPartial。像这样的:

<div>
    @foreach (var item in //Not sure what to pass here)
    {
        @Html.Partial("_PropertyExcerptPartial",item)
    }
</div>

但是,我不能使用局部视图来显示信息,因为它会显示存储在属性数据库中的家具类型的 int 值,我不知道如何获取相应的 FurnitureTypeDescription 并将其传递给局部视图“添加的属性”页面。

任何帮助将不胜感激。非常感谢!

【问题讨论】:

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


    【解决方案1】:

    你应该从设计一个真正的视图模型开始,而不是一些你用ViewModel作为后缀的类,然后把你的领域模型塞进去。那不是视图模型。

    所以想想你需要在视图中处理哪些信息并设计你的真实视图模型:

    public class PropertyExcerptViewModel
    {
        public int NoOfBedrooms  { get; set; }
        public string FurnishedTypeDescription { get; set; }
    }
    

    然后调整您的局部视图以使用此视图模型:

    @model Test.ViewModels.PropertyExcerptViewModel
    <div>
        <h3>
            @Html.DisplayFor(model => model.NoOfBedrooms) 
            bedroom 
            @Html.DisplayFor(model => model.FurnitureTypeDescription) 
            flat to Rent 
        </h3>
        ...
    </div>
    

    好的,现在我们有了一个真实的视图模型,让我们看看如何填充它。所以基本上主视图可以被强类型化为这些视图模型的集合:

    @model IEnumerable<Test.ViewModels.PropertyExcerptViewModel>
    <div>
        @foreach (var item in Model)
        {
            @Html.Partial("_PropertyExcerptPartial", item)
        }
    </div>
    

    最后一点当然是主控制器,它将执行所有数据库查询和构建将传递给主视图的视图模型:

    [Authorize]
    public ActionResult SomeAction()
    {
        // get the currently logged in username
        string user = User.Identity.Name;
    
        // query the database in order to fetch the corresponding domain entities
        IEnumerable<Property> properties = GetAddedProperties(user);
    
        // Now let's build the view model:
        IEnumerable<PropertyExcerptViewModel> vm = properties.Select(x => new PropertyExcerptViewModel
        {
            NoOfBedrooms = x.NoOfBedrooms,
            FurnishedTypeDescription = GetFurnitureType(x.FurnishedType).FurnishedTypeDescription
        });
    
        // and finally pass the view model to the view
        return View(vm);    
    }
    

    如果您使用的是 ORM,请注意 EF 的惰性,以免落入 SELECT N + 1 陷阱。

    【讨论】:

    • 尚未尝试您的解决方案,但我明白您的意思。这真的很有帮助,我知道更多关于使用模型的知识。这是我第一次从事网络开发,您的帖子真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多