如何在asp.net mvc中以编辑模式从dropdownlist获取所选项目

时间:2015-02-18 16:46:45

标签: asp.net-mvc asp.net-mvc-5 edit html.dropdownlistfor

我甚至在页面加载之前尝试编辑下拉列表时遇到错误。这是错误:类型' System.InvalidOperationException'的例外。发生在System.Web.Mvc.dll中但未在用户代码中处理

其他信息:具有密钥'经理'的ViewData项目。属于' System.String'但必须属于' IEnumerable'。

我要做的就是从dropdownlistfor获取所选列表项。我希望它像在创建接受时那样填充,我在Create中选择的所选项目已在Edit中出现。这是我的代码:

型号:

namespace NewHireApp1.Models
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using System.ComponentModel;

public partial class NewHire
{
    public int ID { get; set; }
    [DisplayName("Manager Email")]
    public string Manager { get; set; }
    public string Managers_Email { get; set; }
    public string HR_Emp { get; set; }
    public string Emp_FirstName { get; set; }
    public string Emp_LastName { get; set; }
    public Nullable<System.DateTime> Emp_StartDate { get; set; }
    public string Emp_OfficeLocation { get; set; }
    public string Emp_Department { get; set; }
    public string Emp_Title { get; set; }

    public SelectList ADList { get; set; }
}
}

控制器:

    [HttpGet]
    public ActionResult NewHire(NewHire objadmodel)
    {
        /*Getting data from database*/
        List<ActiveDirectory> objadlist = (from data in objentity.ActiveDirectories select data).ToList();
        objadmodel.ADList = objadlist.Select(m => new SelectListItem { Value = m.mail, Text = m.mail });
        return View(objadmodel);
    }

    public ActionResult NewHireEdit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        NewHire newhire = _entities.NewHires.Find(id);
        List<ActiveDirectory> objadlist = (from data in objentity.ActiveDirectories select data).ToList();
        newhire.ADList = objadlist.Select(m => new SelectListItem { Value = m.mail, Text = m.mail });
        ViewBag.ADList = objadlist.Select(m => new SelectListItem { Value = m.mail, Text = m.mail });
        if (newhire == null)
        {
            return HttpNotFound();
        }
        return View(newhire);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult NewHireEdit(NewHire newhire, int? id)
    {


        if (ModelState.IsValid)
        {
            _entities.Entry(newhire).State = EntityState.Modified;
            _entities.SaveChanges();
            return RedirectToAction("NewHireDetails", this.RouteData.Values);
        }
        return View(newhire);
    }

查看:

  <div class="form-group">
        @Html.LabelFor(model => model.Manager, "Hiring Manager Email:", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(m => m.Manager, Model.ADList, String.Empty, htmlAttributes: new { @id = "ddlAD", @style = "width:500px;", @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Manager, "", new { @class = "text-danger" })
        </div>
    </div>

如果我无法检索所选项目,我可能做错了什么?我是MVC的新手,所以这让我疯狂,我无法理解我的生活。提前感谢您的任何反馈。

1 个答案:

答案 0 :(得分:2)

不要自己创建SelectList。如果您这样做,您将负责选择正确的项目。相反,只需使用IEnumerable<SelectListItem>

public IEnumerable<SelectListItem> ADList { get; set; }

然后,在你的行动中:

objadmodel.ADList = objadlist.Select(m => new SelectListItem { Value = m.mail, Text = m.mail });

此外,您还需要在编辑操作中填充此属性。实际上,你根本不应该将这个属性存储在你的实体上。使用视图模型或将选择列表项放在ViewBag

ViewBag.ADList = objadlist.Select(m => new SelectListItem { Value = m.mail, Text = m.mail });

然后:

@Html.DropDownListFor(m => m.Manager, (IEnumerable<SelectListItem>)ViewBag.ADList)

查看模型是更好的方法。一般来说,如果可能的话,你应该尽量避免使用ViewBag,但这个狭窄的实例是少数几个可以接受的用途之一。