Come faccio a utilizzare editortemplates in MVC3 per i tipi complessi?
-
27-10-2019 - |
Domanda
Ho due classi, Iva e del prodotto. Il prodotto ha una proprietà di IVAT. Sto cercando di modelli di utilizzo dell'editor in MVC per visualizzare un elenco a discesa di tutti gli oggetti del Vat durante la creazione / modifica di un prodotto. Per il caro vita di me non riesco a ottenere questo lavoro.
Ho il seguente codice che visualizza la discesa ma non imposta l'Iva per il prodotto quando il modulo viene inviato.
Controller:
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
)
Le sarei grato se qualcuno può far luce su questo o anche punto me un buon esempio da qualche parte sul web ... Sono stato bloccato con questo per un bel paio di giorni.
Soluzione
Vorrei usare una vista fortemente tipizzati e visualizzare i modelli in quanto rende le cose molto più facile, piuttosto che ViewBag.
Quindi, iniziare con un modello di vista:
public class VatRateViewModel
{
public string SelectedVatRateId { get; set; }
public IEnumerable<IVatRate> Rates { get; set; }
}
quindi un controllore:
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
...
}
}
Visualizza:
@model VatRateViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(
x => x.SelectedVatRateId,
new SelectList(Model.Rates, "Id", "Description")
)
<input type="submit" value="OK" />
}
E se si voleva utilizzare editor di modelli per la VatRateViewModel si potrebbe definire uno in ~/Views/Shared/EditorTemplates/VatRateViewModel.cshtml
:
@model VatRateViewModel
@Html.DropDownListFor(
x => x.SelectedVatRateId,
new SelectList(Model.Rates, "Id", "Description")
)
e poi ogni volta che da qualche parte si dispone di una proprietà di tipo VatRateViewModel
si potrebbe semplicemente:
@Html.EditorFor(x => x.SomePropertyOfTypeVatRateViewModel)
che renderebbe Editor modello corrispondente.