我有以下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”等。
答案 0 :(得分:1)
是的,你可以。实际上你的方法是正确的,但一般来说,对于编辑和显示,EditorTemplates
和DisplayTemplates
优先于部分观点
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);
}