如何使用MVC中的viewmodel创建显示主信息和详细信息的视图?

时间:2012-05-08 09:00:04

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

我有以下viewmodel:

namespace WebUx
{
    public class CityViewModel
    {
        public City City { get; set; }
        public IList<CityDetail> CityDetails { get; set; }
    }
}

以下大师班:

Class City {
     public string Name { get; set; }
     public string Type { get; set; }
}

以下详细课程:

Class CityDetail {
     public string   Number { get; set; }
     public string   Street { get; set; }
}

我想要做的是在视图中使用viewmodel,其中视图中的表单将首先显示一些基本的城市信息,然后在底部有一个区域,其中 CityDetail记录。

有没有办法可以用局部视图来做到这一点?我理解有关局部视图的一些事情,但我怎么能写这个以满足我的需求呢?我是否可以从视图中调用局部视图,同时创建空白记录,其中包含可以填写的详细信息,当我返回到我的操作时,这些记录将成为模型的一部分。我怎么能处理标签呢。例如,我希望每个街道的标签显示为“街道1”,“街道2”等。

2 个答案:

答案 0 :(得分:1)

是的,你可以。实际上你的方法是正确的,但一般来说,对于编辑和显示,EditorTemplatesDisplayTemplates优先于部分观点

CityViewModel设计是正确的,我会这样做

为CityDetail Views/Shared/DisplayTemplates/CityDetail.cshtml创建DisplayTemplate。

为城市Views/Shared/EditorTemplates/City.cshtml创建EditorTemplate。这将是

@model City
@Html.LabelFor(model => model.Name)
@Html.EditorFor(model => model.Name)
@Html.LabelFor(model => model.Type)
@Html.EditorFor(model => model.Type)

添加操作视图

@model CityViewModel
@using(Html.BeginForm())
{
     @Html.EditorFor(model => model.City) // this will render city editor by calling editor template above
     <input type="submit" value="ok"/>
}
@Html.DisplayFor(model => model.CityDetails) //this will render all of cities in list by calling display template above for each

行动

public ActionResult CreateCity(CityViewModel cityModel)
{
    // cityModel.City is populated with values entered by user
}

答案 1 :(得分:0)

您可以在同一视图中同时拥有这两个实体。我用来为主实体创建一个区域,然后是详细实体的网格,以及在ChildWindow中打开这些详细实体以创建,编辑或删除的按钮。一切都使用相同的视图模型。

不要忘记在服务器端的对象中包含详细信息实体,如下所示:

[MetadataTypeAttribute(typeof(MasterEntity.MasterEntityMetadata))]
    public partial class MasterEntity
    {
        internal sealed class MasterEntityMetadata
        {
            private MasterEntityMetadata()
            {
            }

            [Include]
            public EntityCollection<DetailEntity> DetailEntity{ get; set; }
        }
    }

然后,在你的服务上这样做:

public IQueryable<MasterEntity> GetMasterEntity()
        {
            return this.ObjectContext.MasterEntities.Include("DetailEntity").Where(p => SOMEFILTER).OrderBy(p => SOMEVALUE);
        }