Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC 5与DropDownList的一对多关系_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc ASP.NET MVC 5与DropDownList的一对多关系

Asp.net mvc ASP.NET MVC 5与DropDownList的一对多关系,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我试图实现一个下拉列表,通过一对多关系选择项目 当表单发回控制器时,package.Platform对象为空,所以我不知怎么搞砸了映射 /Models/Package.cs public class Package { public int ID {get; set;} ... public Platform Platform {get; set;} } public class Platform { public int ID { get; set; }

我试图实现一个下拉列表,通过一对多关系选择项目

当表单发回控制器时,
package.Platform
对象为空,所以我不知怎么搞砸了映射

/Models/Package.cs

public class Package 
{
    public int ID {get; set;}

    ...

    public Platform Platform {get; set;}
}
public class Platform
{
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(
    [Bind(Include = "ID,Name,Description,Version,Filename,Platform,IsPublished,ReleaseNotesURL")] Package package)
{
    if (ModelState.IsValid)
    {
        package.Version = VersionParser.ParseVersion(package.Filename).ToString();
        db.Entry(package).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    PopulatePlatformsDropDownList(package.Platform.ID); //<<-- package.Platform is null

    return View(package);
}

...

private void PopulatePlatformsDropDownList(int? selectedPlatform)
{
    var platforms = from d in db.Platforms
                    orderby d.Name
                    select d;
    ViewBag.Platforms = new SelectList(platforms, "ID", "Name", selectedPlatform);
}
/Models/Platform.cs

public class Package 
{
    public int ID {get; set;}

    ...

    public Platform Platform {get; set;}
}
public class Platform
{
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(
    [Bind(Include = "ID,Name,Description,Version,Filename,Platform,IsPublished,ReleaseNotesURL")] Package package)
{
    if (ModelState.IsValid)
    {
        package.Version = VersionParser.ParseVersion(package.Filename).ToString();
        db.Entry(package).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    PopulatePlatformsDropDownList(package.Platform.ID); //<<-- package.Platform is null

    return View(package);
}

...

private void PopulatePlatformsDropDownList(int? selectedPlatform)
{
    var platforms = from d in db.Platforms
                    orderby d.Name
                    select d;
    ViewBag.Platforms = new SelectList(platforms, "ID", "Name", selectedPlatform);
}
/Controllers/PackagesController.cs

public class Package 
{
    public int ID {get; set;}

    ...

    public Platform Platform {get; set;}
}
public class Platform
{
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(
    [Bind(Include = "ID,Name,Description,Version,Filename,Platform,IsPublished,ReleaseNotesURL")] Package package)
{
    if (ModelState.IsValid)
    {
        package.Version = VersionParser.ParseVersion(package.Filename).ToString();
        db.Entry(package).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    PopulatePlatformsDropDownList(package.Platform.ID); //<<-- package.Platform is null

    return View(package);
}

...

private void PopulatePlatformsDropDownList(int? selectedPlatform)
{
    var platforms = from d in db.Platforms
                    orderby d.Name
                    select d;
    ViewBag.Platforms = new SelectList(platforms, "ID", "Name", selectedPlatform);
}
(为了简洁起见,省略了FKs)


因此,我需要获取
package.Platform
值以正确发布,在
PackagesController
Edit()
方法中获取它,并将其保存

您试图将下拉列表绑定到复杂属性。只能绑定到值类型。它需要是
@Html.DropDownListFor(m=>model.Platform.ID,
,当前当您发回时,
DefaultModelBinder
将尝试设置
package.Platform=“1”
(或“2”)这将失败,因此
平台
的值为
注意
模型状态
将始终无效,因为您在
平台.Name
属性上有
[必需的]
属性(您没有绑定到
名称
属性,因此它将始终为
,因此无效)@StephenMuecke太好了!我现在在我的POST操作中获得Package.Platform对象。但是,它没有在SaveChanges()上保存到数据库。下面是生成的SQL:UPDATE[dbo].[Packages]SET[Name]=@0、[Description]=@1、[Version]=@2、[Filename]=@3、[IsPublished]=@4、[ReleaseNotesURL]=@5其中([ID]=@6)--注意平台ID丢失。我不使用EF,因此无法确定,但我怀疑
需要包含外键/导航属性-
public int Platform_ID{get;set;}public virtual Platform{get;set;}
-您将下拉列表绑定到
平台ID
我认为导航属性应该是隐式的,但我会尝试一下。