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();
     }
È stato utile?

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();
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top