1

我正在自学asp .net mvc3。

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

局部视图基本上给出了属性的一个小描述。'_PropertyExcerptPartial' 的片段如下:

@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; }
}

该模型查找的两个2数据库如下:

 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 并将其从“添加”传递给局部视图属性”页面。

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

4

1 回答 1

4

你应该从设计一个真实的视图模型开始,而不是一些你给它的名字加上后缀的类,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陷阱。

于 2012-08-28T19:02:25.303 回答