Как использовать Editortemplates в MVC3 для сложных типов?
-
27-10-2019 - |
Вопрос
У меня есть два класса, НДС и продукт. Продукт имеет собственность IVAT. Я пытаюсь использовать шаблоны редактора в MVC для отображения раскрывающегося списка всех объектов НДС при создании/редактировании продукта. Для дорогой жизни меня я не могу работать.
У меня есть следующий код, который отображает выпадающий список, но он не устанавливает НДС для продукта при подаче формы.
Контроллер:
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
)
Я был бы благодарен, если кто -то сможет пролить немного света на это или даже указать мне на хороший пример в Интернете ... Я застрял с этим уже несколько дней.
Решение
Я бы использовал крепко напечатанные представления и виды моделей, поскольку это делает вещи намного проще, а не 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)
который сделает соответствующий шаблон редактора.