質問

???????????????????????AppCategory ????????????????????????????

????????????·????????

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

??????????(??????1????EditorTemplate?????????)

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

?????????????

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


??????????????
?

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

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

????????????? '1' ???????
????????????????????????????????????????

??????????

?????????? ???MVCScaffold

?????????????????????
    [HttpPost]
    public ActionResult Create(App d)
    {
        if (ModelState.IsValid)
        {
          context.Apps.Add(d);
          context.SaveChanges();
          return RedirectToAction("Index");  
        }
        return View();
     }
役に立ちましたか?

解決

My model was incorrectly set up ... virtual ICollection and just the foreign key id for the sub and everything worked... changes below

Model

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

他のヒント

If you bind your dropDownList to Category.Id, you'll at least get the selected value into that filed, but nothing else in your Category Object.

The model binder cannot create the AppCategory object from the form collection in your Create action because the form only has an ID for that object (the other properties of AppCategory are not there).

The quickest solution would be setting the Category property of your App object manually, like this :

[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();
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top