Как использовать редакторские шаблоны в MVC3 для сложных типов? - PullRequest
6 голосов
/ 12 июня 2011

У меня есть два класса, НДС и продукт. Продукт имеет свойство IVat. Я пытаюсь использовать шаблоны редактора в MVC для отображения выпадающего списка всех объектов Vat при создании / редактировании продукта. Для моей дорогой жизни я не могу заставить это работать.

У меня есть следующий код, который отображает раскрывающийся список, но он не устанавливает НДС для продукта при отправке формы.

Контроллер:

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
    )

Буду признателен, если кто-нибудь сможет пролить свет на это или даже указать мне на хороший пример где-нибудь в Интернете ... Я застрял с этим довольно много дней.

1 Ответ

7 голосов
/ 13 июня 2011

Я бы использовал строго типизированные представления и модели представлений, поскольку это значительно упрощает работу, а не 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)

, который будет отображать соответствующий шаблон редактора.

...