我很难弄清楚要走哪条路。 在我开始之前,这里有一些类:
public class Car
{
[Key]
[Required]
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
[MaxLength(255)]
public string Title { get; set; }
[Required]
public DateTime Date{ get; set; }
public virtual Category Category { get; set; }
}
public class Category {
[Key]
[Required]
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int ID {get;set;}
public Category Parent{get;set;}
[Required]
[MaxLength(255)]
public string Title {get;set;}
}
因此,要创建一个新的“Car”,我只需要一个包含所有类别下拉列表的页面。为此,我写了一个新类并将其传递给“ActionResult Create”......
这是:
public class CarCreate
{
public Car Car { get; set; }
public List<Category> Categories
{
get
{
List<Category> list = new List<Category>();
SystemContext sc = new SystemContext();
list = sc.Categories.ToList();
list.Insert(0, null);
sc.Dispose();
return list;
}
}
}
从控制器我传递了它:
public ActionResult Create()
{
return View(new CarCreate());
}
在视图中,我在CarCreate类中为List创建了一个下拉列表:
<div class="col-md-4">
@Html.LabelFor(t => t.Car.Title)
@Html.TextBoxFor(model => model.Car.Title, new { @class = "form-control" })
</div>
<div class="col-md-4">
@Html.LabelFor(t => t.Car.Category)
@Html.DropDownListFor(model => model.Car.Category, new SelectList(Model.Categories, "ID", "Title","Select"), new { @class = "form-control" })
</div>
当我检查处理回发的ActionResult中的Car.Category时:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CarCreate emc)
{
Response.Write(emc.Car.Title);
Response.Write(emc.Car.Category== null ? "null" : "notnull");
return View(new CarCreate());
}
我可以获得头衔。但是类别总是为空。
从回发中获取类别我需要做些什么?
答案 0 :(得分:2)
我相信这是因为你的分类不是真实的。尝试在Car构造函数中添加它:
public class Car
{
public Car()
{
this.Category = new Category();
}
}
希望它有所帮助!
答案 1 :(得分:1)
DropDownListFor映射的值由select中选择的选项定义。 您尝试在复杂对象中设置此值。
我认为你应该有像
这样的东西 public class Car
{
[Key]
[Required]
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
[MaxLength(255)]
public string Title { get; set; }
[Required]
public DateTime Date{ get; set; }
public virtual int CategoryID { get ; set;}
public virtual Category Category { get; set; }
}
并且
<div class="col-md-4">
@Html.LabelFor(t => t.Car.Category)
@Html.DropDownListFor(model => model.Car.CategoryID, new SelectList(Model.Categories, "ID", "Title","Select"), new { @class = "form-control" })
</div>
答案 2 :(得分:0)
我会尽可能保持我的视图模型。只需在视图中保留您真正需要的属性即可。此外,我更喜欢将它们保留为简单的POCO(不包含数据加载逻辑),以便我可以在很多地方使用它。
public class CreateCarVM
{
[Required]
public string Title { set;get;}
public List<SelectListItem> Categories { set;get;}
[Required]
public int SelectedCategory { set;get;}
public CreateCarVM()
{
Categories =new List<SelectListItem>();
}
}
并在我的创建操作方法中
public ActionResult Create()
{
var vm=new CreateCarVM();
vm.Categories=GetCategories();
return View(vm);
}
private List<SelectListItem> GetCategories()
{
var list=new List<SelectListItem>();
//2 items hard coded for demo. You may load it from db
list.Add(new SelectListItem { Value="1", Text="Sedan"});
list.Add(new SelectListItem { Value="2", Text="SUV"});
return list;
}
并在您的视图中强选键入CreateCarVM
@model CreateCarVM
@using(Html.BeginForm())
{
@Html.TextBoxFor(s=>s.Title)
@Html.DropDownListFor(s=>s.SelectedCategory,Model.Categories,"Select")
<input type="submit" />
}
现在发布表单时,您可以检查viewmodel的SelectedCategory
属性
[HttpPost]
public ActionResult Create(CreateCarVM model)
{
if(ModelState.IsValid)
{
//check for model.SelectedCategory now
// to do :Save and Redirect (PRG pattern)
}
model.Categories=GetCategories();
return View(model);
}