ASP.NET EditorTemplate DropDownList
-
10-10-2019 - |
Domanda
Ogni volta che aggiungo una nuova applicazione Si crea un nuovo AppCategory . Sto seriamente scopare questa in qualche modo
quadro codice prima entità oggetti
public class AppCategory
{
public int ID { get; set; }
public string Name { get; set; }
public ICollection<App> apps { get; set; }
}
public class App
{
public int ID { get; set; }
public string Name { get; set; }
public AppCategory Category { get; set; }
}
Template Editor (mi piacerebbe fare solo un solo Foreign Key EditorTemplate)
@inherits System.Web.Mvc.WebViewPage
@Html.DropDownList("Category", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect())
e, naturalmente, il repository
public static IEnumerable<SelectListItem> GetAppCategoriesSelect()
{
return (from p in GetAppCategories()
select new SelectListItem
{
Text = p.Name,
Value = p.ID.ToString(),
});
}
public static ICollection<AppCategory> GetAppCategories()
{
var context = new LIGDataContext();
return context.AppCategories.ToList();
}
Ogni volta che aggiungo una nuova applicazione Si crea un nuovo AppCategory Sto seriamente scopare questa in qualche modo
L'aggiunta di ulteriori informazioni di debug
@inherits System.Web.Mvc.WebViewPage
@Html.DropDownList("", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect())
mi dà un messaggio di convalida sul palo
Parameters application/x-www-form-urlencoded
Category 1
Name 8
Errore di convalida Il valore '1' non è valido.
Ciò ha senso perché Categoria deve essere un numero intero non oggetto.
Codice di controllo come richiesto abbastanza sicuro che questo non è il problema come è arrivata da MVCScaffold
[HttpPost]
public ActionResult Create(App d)
{
if (ModelState.IsValid)
{
context.Apps.Add(d);
context.SaveChanges();
return RedirectToAction("Index");
}
return View();
}
Soluzione
Il mio modello è stato erroneamente configurato ... ICollection virtuale e solo l'id chiave esterna per il sub e tutto ha funzionato ... cambiamenti di sotto
Modello
public class AppCategory
{
public int ID { get; set; }
public string Name { get; set; }
public **virtual** ICollection<App> Apps { get; set; }
}
public class App
{
public int ID { get; set; }
********************************************
[UIHint("AppCategory")]
public int AppCategoryID { get; set; }
********************************************
public string Name { get; set; }
}
public class LIGDataContext : DbContext
{
public DbSet<AppCategory> AppCategories { get; set; }
public DbSet<App> Apps { get; set; }
}
/Views/Shared/EditorTemplates/AppCategory.cshtml
@inherits System.Web.Mvc.WebViewPage
@Html.DropDownList("", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect())
AppController
[HttpPost]
public ActionResult Create(App d)
{
if (ModelState.IsValid)
{
this.repository.Add(d);
this.repository.Save();
return RedirectToAction("Index");
}
return View();
}
Altri suggerimenti
Se vincolare il proprio DropDownList a Category.Id, avrete almeno ottenere il valore selezionato in quella depositata, ma niente altro nella vostra categoria oggetto.
Il modello legante non può creare l'oggetto AppCategory
dalla collezione modulo nella vostra azione Create
perché la forma ha solo un ID per l'oggetto (le altre proprietà della AppCategory
non sono lì).
La soluzione più veloce sarebbe impostando la proprietà Category
del vostro oggetto App
manualmente, in questo modo:
[HttpPost]
public ActionResult Create(App d) {
int categoryId = 0;
if (!int.TryParse(Request.Form["Category"] ?? String.Empty, out categoryId) {
// the posted category ID is not valid
ModelState.AddModelError("Category",
"Please select a valid app category.")
} else {
// I'm assuming there's a method to get an AppCategory by ID.
AppCategory c = context.GetAppCategory(categoryID);
if (c == null) {
// couldn't find the AppCategory with the given ID.
ModelState.AddModelError("Category",
"The selected app category does not exist.")
} else {
// set the category of the new App.
d.Category = c;
}
}
if (ModelState.IsValid)
{
context.Apps.Add(d);
context.SaveChanges();
return RedirectToAction("Index");
}
return View();
}