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
我认为导航属性应该是隐式的,但我会尝试一下。