2015-04-01 27 views
0

我一直在使用C#,並且完成了我的web表單的共享,但我對MVC非常陌生,並且我不知道如何將這個問題用詞組來獲得Google的幫助。嵌套部分和模板;如何實現條件視圖或編輯器?

我正在開發一個由EF支持的MVC站點,並試圖弄清楚事情的竅門。所以我有一個允許用戶創建實體「A」的視圖。實體A有一個對實體B的引用,它是地址,它又對實體C的引用是地址'區域。

所以我想通了,我可以創建一個編輯器模板,可以注入實體A的創建視圖,並返回與它的實體B參考填充的A模型。我可以在實體B模板上做同樣的事情,爲實體C注入一個編輯器模板並獲取B的引用屬性中的正確實體。

我的問題是,實體C是一個很少創建的實體。用戶需要創建一個實體的能力,這是一個非常簡單的實體(具有名稱和country_enum),所以我不希望用戶只有在他們發現正確的C實體尚未在列表中,然後返回到頁面並重新輸入它們可能已經填充的所有其他字段。

如何創建一個「條件」視圖或一組視圖,這將允許用戶選擇一個現有的實體C,或者創建一個新的實體C(如果他們需要的話),而不必離開Create-Entity 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>  
} 

EditorTemplates/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) 

在第二視圖/模板,我需要一個方法來渲染一個完整的「創建新區域」編輯器模板(它現在執行)或者從下拉菜單中選擇現有區域「view/template/etc,這仍然會返回區域模型相同的wa它目前確實(或接近)。我的偏好是儘可能避免使用JS,但是你是專家!

+0

如果你不想讓你的'添加新區域'按鈕重定向到一個新頁面,那麼你需要javascript/jquery來顯示一個彈出窗體來輸入新的區域細節,然後使用ajax發佈它,如果成功,將新的區域添加到下拉列表(並選擇它) – 2015-04-01 23:23:49

回答

1

您需要爲您的域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。我沒有測試過,但它應該給你方向。嘗試一下。祝你好運。

+0

嗯,這似乎並不像現在這樣,認爲有很好的機會我做錯了。我在這個視圖中使用複合模型,因此我已將SelectedID屬性添加到該模型中。第一次,表單呈現,但我沒有得到任何財產(都爲空)。我改變了...什麼?現在整個地區編輯拒絕呈現。儘管如此,我認爲你已經走上了正確的軌道,而且我會繼續擺弄MVC,並在正確的時候回報。 – Caleb 2015-04-01 20:19:49

+0

下拉列表的名稱應爲'Address.SelectedRegionId',假設您使用複合視圖模型。我的名字錯了。此外,您需要將HtmlFiledPrefix傳遞給您的編輯以正確命名屬性。 – vortex 2015-04-02 04:55:22

相關問題