2011-06-12 62 views
6

我有兩個類,增值稅和產品。產品具有IVat的屬性。我正在嘗試使用MVC中的編輯器模板在創建/編輯產品時顯示所有Vat對象的下拉列表。對於我的親愛的生活,我無法得到這個工作。如何在MVC3中爲複雜類型使用editortemplates?

我有下面的代碼顯示下拉列表,但它沒有設置提交表單時產品的增值稅。

控制器:

IList<IVatRate> vatRates = SqlDataRepository.VatRates.Data.GetAllResults(); 
ViewBag.VatRates = new SelectList(vatRates, "Id", "Description"); 

Add.cshtml

@Html.EditorFor(model => model.VatRate.Id, "VatSelector", (SelectList)ViewBag.VatRates) 

VatSelector.cshtml

@model SelectList 
@Html.DropDownList(
     String.Empty /* */, 
      (SelectList)ViewBag.Suppliers, 
     Model 
    ) 

我將不勝感激,如果有人可以提供一些線索這光,甚至點我在網絡上的一個很好的例子...我已經堅持了這個好幾天了。

回答

7

我會使用強類型視圖和視圖模型,因爲它使事情變得如此簡單,而不是ViewBag。

因此,與視圖模型開始:

public class VatRateViewModel 
{ 
    public string SelectedVatRateId { get; set; } 
    public IEnumerable<IVatRate> Rates { get; set; } 
} 

然後控制器:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new VatRateViewModel 
     { 
      Rates = SqlDataRepository.VatRates.Data.GetAllResults() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(VatRateViewModel model) 
    { 
     // model.SelectedVatRateId will contain the selected vat rate id 
     ... 
    } 
} 

查看:

@model VatRateViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(
     x => x.SelectedVatRateId, 
     new SelectList(Model.Rates, "Id", "Description") 
    ) 
    <input type="submit" value="OK" /> 
} 

如果你想使用的編輯器模板的VatRateViewModel你可以在~/Views/Shared/EditorTemplates/VatRateViewModel.cshtml中定義一個:

@model VatRateViewModel 
@Html.DropDownListFor(
    x => x.SelectedVatRateId, 
    new SelectList(Model.Rates, "Id", "Description") 
) 

,然後每當某個地方你有類型的屬性VatRateViewModel你可以簡單地說:

@Html.EditorFor(x => x.SomePropertyOfTypeVatRateViewModel) 

這將使相應的編輯器模板。

+0

感謝您的回答。 editortemplate是否有單獨的控制器?如果不這樣做,那麼我的產品的價值觀將如何設定,如果確實如此,那麼它會到哪裏去?它應該被稱爲什麼?我之前嘗試過,無法啓動它。 – Pieter 2011-06-12 21:37:06

+0

好的,很多血,汗水和眼淚後來我最終得到它排序。我不得不將所有複雜類型添加到ViewModel以及我的產品。再次感謝! – Pieter 2011-06-14 19:31:06