2010-11-15 14 views
9

Cada vez que agrego una nueva aplicación, crea una nueva AppCategory. Estoy seriamente atornillar esto de alguna maneraASP.NET Editor DropdownList

código de marco primera entidad de objetos

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; } 
} 

Editor de plantillas (me encantaría acaba de hacer tan sólo una tecla EditorTemplate Exteriores)

@inherits System.Web.Mvc.WebViewPage 
@Html.DropDownList("Category", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect()) 

y por supuesto el repositorio

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(); 
    } 

Cada vez que agrego una nueva aplicación Crea una nueva AppC ategoría Estoy seriamente atornillar esto de alguna manera


La adición de más información de depuración

@inherits System.Web.Mvc.WebViewPage 
@Html.DropDownList("", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect()) 

me da un mensaje de validación en el puesto

Parameters application/x-www-form-urlencoded 
Category 1 
Name 8 

de error de validación El valor '1' es inválido.
Esto tiene sentido porque Categoría debe ser un objeto, no un número entero.


Código controlador como pedido bastante seguro de que este no es el problema, ya que venía de MVCScaffold

[HttpPost] 
    public ActionResult Create(App d) 
    { 
     if (ModelState.IsValid) 
     { 
      context.Apps.Add(d); 
      context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(); 
    } 
+0

no tengo idea de lo que su pregunta es o cómo ha llegado hasta un upvote para el artículo. ¿Has recorrido el programa en un depurador para restringir dónde se produce el problema? –

+0

desde el controlador [HttpPost] public ActionResult Create (Aplicación d) Obtengo d.Category es nulo (por eso está creando uno nuevo) pero no sé por qué obtengo d.Category es nulo – MarkKGreenway

+0

Publique su código de controlador por favor. Estoy bastante seguro de que el problema está ahí. – jfar

Respuesta

5

Mi modelo era correcto, era hasta ... ICollection virtual y sólo el ID de clave externa para la sub y todo funcionó ... cambios siguientes

Modelo

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; } 
} 

/Vistas/compartido/EditorTemplates/AppCateg ory.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(); 
    } 
0

Si enlaza su DROPDOWNLIST a Category.Id, que al menos obtendrá la valor seleccionado en ese archivo, pero nada más en su objeto de categoría.

+0

Todavía intenta crear un nuevo objeto Categoría – MarkKGreenway

0

El modelo de cuaderno no puede crear el objeto AppCategory de la colección de formularios en su acción Create porque el formulario solo tiene un ID para ese objeto (las otras propiedades de AppCategory no están allí).

La solución más rápida sería la configuración de la propiedad Category de su objeto App manualmente, así:

[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(); 
} 
Cuestiones relacionadas