2016-12-16 112 views
0

我有一些SelectList和DropDownList的问题。 ICH有两种型号(TimeRecord有一个导航属性项目):ASP NET MVC 5 SeletList DropDownList

public class Project 
{ 
    public int ProjectId { get; set; } 

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

public class TimeRecord 
{ 
    public int TimeRecordId { get; set; } 
    public int ProjectId { get; set; } 

    public string Description { get; set; } 

    public Project TmRecProject { get; set; } 
} 

在我创建行动方法控制选择列表的是路过ViewBag到视图(到现在都是正确的工作)

public ActionResult Create() 
    { 
     ViewBag.ProjectId = new SelectList(db.Projects, "ProjectId", "ProjectName"); 
     return View(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(TimeRecord timeRecord) 
    { 
     if (ModelState.IsValid) 
     { 
      db.TimeRecords.Add(timeRecord); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(timeRecord); 
    } 

这里查看:

@model SelectListDropDownTest.Models.TimeRecord 

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>TimeRecord</h4> 
    <hr /> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

    <div class="form-group"> 
     @Html.LabelFor(model => model.TmRecProject.ProjectId, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownList("ProjectId", null, new { @class = "form-control" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 
} 

在创建视图中,我可以从DropDownList中选择一个项目。我的问题是,当我将模型“TimeRecord”传递回控制器时,项目“TmRecProject”始终为空。

解决此问题的最佳方法是什么?

+0

您需要绑定“ProjectId”(而不是'TmRecProject'),这是您的代码正在执行的操作(虽然很糟糕) - 它将保存数据时更新的“ProjectId”的值。你的实现意味着你不会得到客户端验证,并且'SelectList'的名字需要和你绑定的属性不同,以便在视图中它的'@ Html.DropDownListFor(m => m.ProjectId,(SelectList )ViewBag.ProjectList,new {@class =“form-control”})'无论如何,您的编辑数据总是使用视图模型 –

回答

0

首先,我不能理解你如何能够从下拉列表中选择值,因为你没有绑定你的'ViewBag.ProjectId'和你的下拉列表。 你的看法和你的代码的变化将开始工作!

变化:

绑定的下拉列表,在视图模型。

@Html.DropDownListFor(model => model.TmRecProject.ProjectId, ViewBag.ProjectId as IEnumerable<SelectListItem>, new { @class = "form-control" }) 

其他都是这样,你会得到你的post方法的数据。

+0

不,它不起作用...结果与我的示例相同 – user3356236

+0

刚刚更新。检查一次。 – Anadi

+0

这更好,但现在问题我得到了ProjectId但ProjectName为空(在TmRecProject中)。和我的ModelState.IsValid返回一个false。但你给了正确的小费来解决问题... – user3356236