繁体   English   中英

ViewBag中的MVC5视图下拉列表

[英]MVC5 view drop down list from ViewBag

我是MVC5 / C#的新手(刚开始使用Silverlight项目),并且正在使用Web应用程序(而不是ASP.net)。 我不知道如何从ViewBag(而不是模型)填充的下拉列表中获取值。 我所看到的所有内容都针对ASP.NET和/或从模型中填充下拉列表。

我有这种模式的转变:

   public class Shift
   {
      public Guid ShiftID { get; set; }
      public string AreaOfOperation { get; set; }
      public string UserName { get; set; }
      public DateTime StartTime { get; set; }
      public DateTime EndTime { get; set; }
   }

这对于AreaOfOperations:

   public class AreaOfOperations
   {
      public Guid AreaOfOperationsID { get; set; }
      public String AreaOfOperation { get; set; }
      public bool InUse { get; set; }      
   }

相关的控制器代码,通过一个有效的下拉列表很好地填充了视图:

  public ActionResult Create(DateTime? datetime)
  {
     List<AreaOfOperations> list = db.AreaOfOperations.Where(i => i.InUse == true).OrderBy(aoo => aoo.AreaOfOperation).ToList();
     ViewBag.DropDownAOOs = new SelectList(list, "AreaOfOperationsID", "AreaOfOperation");

     Shift shift = new Shift();
     shift.ShiftID = Guid.NewGuid();
     shift.StartTime = DateTime.Now;
     shift.UserName = User.Identity.Name;
     return View(shift);
  }

  // POST: Shifts/Create
  // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
  // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
  [HttpPost]
  [ValidateAntiForgeryToken]
  public ActionResult Create([Bind(Include = "ShiftID,AreaOfOperations,UserName,StartTime")] Shift shift)
  {
     try
     {
        if (ModelState.IsValid)
        {
           shift.ShiftID = Guid.NewGuid();
           db.Shifts.Add(shift);
           db.SaveChanges();
           return RedirectToAction("Index");
        }
     }
     catch (DataException /* dex */)
     {
        //Log the error (uncomment dex variable name and add a line here to write a log.
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
     }
     return View(shift);
  }

我的看法是:

@model CRMgr5.Models.Shift

@{
    ViewBag.Title = "Start Shift";
}

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

    <div class="form-horizontal">
        <h4>Shift</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.AreaOfOperations, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("AreaOfOperation", ViewBag.DropDownAOOs as SelectList, new { htmlAttributes = new { @class = "form-control" } })
            </div>
        </div>

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

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

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


<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

任何帮助将不胜感激。 谢谢。

在下拉列表中,您将选择命名为“ AreaOfOperation”,但模型属性称为“ AreaOfOperations”。 因此,绑定器将无法绑定它。

正如这里已经有人建议的那样,您应该使用强类型的html帮助器,例如DropDownListFor:

@Html.DropDownListFor(m => m.AreaOfOperations, ViewBag.DropDownAOOs as SelectList)

您是为标签做的,不确定是为什么在生成下拉列表时选择不使用它?

我只是重新创建了整个程序,效果很好

我在您的Bind属性中删除了AreaOfOperations

[Bind(Include = "ShiftID,AreaOfOperation(s),UserName,StartTime")]

据我所知,您可以一起删除此参数属性。 仅在您只想绑定到视图模型的某些属性时使用。

但是,有一个错误:如果您的ModelState无效,则必须重新填充选择列表。 否则你的

  return View(shift);

没有数据来呈现新的SelectList。

另一种方法是将数据放入ViewModel中,并在默认构造函数中对其进行初始化。 然后,您不必担心数据或转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM