嵌套的分部和模板;如何实现条件视图或编辑器



我使用C#已经有一段时间了,并且已经完成了我的web表单共享,但我对MVC非常陌生,我真的不知道如何表达这个问题来获得谷歌的帮助。

我正在开发一个由EF支持的MVC网站,只是想掌握窍门。因此,我有一个允许用户创建实体"a"的视图。实体A引用了实体B的地址,而实体B又引用了实体C的地址区域。

因此,我发现我可以创建一个编辑器模板,该模板可以被注入实体A的create视图中,并返回填充了实体B引用的A模型。我可以在实体B模板上做同样的事情,为实体C注入一个编辑器模板,并在B的引用属性中返回正确的实体。

我的问题是,实体C是一个很少创建的实体。用户需要创建一个实体的能力,而这是一个非常琐碎的实体(有name和country_enum),所以我不希望用户在发现列表中还没有正确的C实体后,就必须访问一个特殊的页面来创建这个实体,然后返回页面,重新输入他们可能已经填写的所有其他字段。

如何创建一个"条件"视图或一组视图,允许用户选择现有实体C,或者在需要时创建新实体C,而不离开创建实体a页面?

为了清楚起见,这是我目前的设置:

EntityA-Create.cshtml

@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()
  @Html.HiddenFor(A => A.ParentID)
  <fieldset>
    //Entity A editors etc...
    @Html.EditorFor(A => A.Address, "Address.cshtml", null)
  </fieldset>      
}

编辑器模板/Address.cshtml

@model Models.Address
<div class="editor-label">
  @Html.LabelFor(B => B.Property1)
</div>
<div class="editor-field">
  //Entity B Property editors etc...
</div>
@Html.EditorFor(B=> B.Region, "Region.cshtml", null)

在第二个视图/模板中,我需要一种方法来呈现一个完整的"创建新区域"编辑器模板(它现在这样做),或者一个"从下拉列表中选择现有区域"视图/模板等,它仍然会以当前(或接近)的方式返回区域模型。我倾向于用这个解决方案尽可能避免JS,但你是专家!

您需要使用域Regions创建一个Select List。我个人使用我的视图模型进行此类方法。

        public class Address
        {
            public Address()
            {
                Regions  = new List<SelectListItem>();
            }
            //Your Address Properties
            public int SelectedRegionId {get; set;}
            public IEnumerable<SelectListItem> Regions {get; set;}
            //You can fill the Regions list in the controller, or in the contructor
            public IEnumerable<SelectListItem> CreateRegionsSelectList()
            {
                var regions = new List<SelectListItem>();
                var domainRegions = // Get your regions from Repository;
                foreach (var region in domainRegions)
                    regions.Add(new SelectListItem { Text = region.Name, Value = region.Id};
            }
        }

然后你可以在地址编辑器中为你的域区域创建下拉列表:

@model Models.Address
<div class="editor-label">
  @Html.LabelFor(B => B.Property1)
</div>
<div class="editor-field">
  //Entity B Property editors etc...
</div>
Select Existing Region: @Html.DropDownFor(x => x.SelectedRegionId, Model.Regions, new {Name = "Address.SelectedRegionId"})
Or Create New Region: <input id="createRegion" type="button" value="Create Region" />
<div id="regionsEditorWrapper" display:"style:none">
@Html.EditorFor(B=> B.Region, "Region.cshtml", null)
</div>

并用简单的jQuery函数显示隐藏的编辑器。

$(document).ready(function(){
    $("#createRegion").click(function(){
        $("#regionsEditorWrapper").show();
    });
});

如果你从下拉列表中选择并发布,你应该在发布操作方法中获得区域id。我还没有测试过,但它应该会给你指引方向。试试看。祝你好运。

最新更新