MVC 4 DropDownListFor基于文本设置所选项

时间:2013-06-22 15:03:55

标签: c#-4.0 asp.net-mvc-4 razor html.dropdownlistfor

通常当我使用DropDownListFor帮助器时,我选择基于ID(int)选择哪个项目,但是现在我需要根据文本(字符串)显示选择哪个项目而不是一个ID。在控制器中,模型正确设置为我想要的值:

model.Title

示例标题是“Front Office”。我的控制器中有以下代码:

ViewBag.Titles = new SelectList(jobTitles, "Name", "Name");

在视图中我有这个:

@Html.DropDownListFor(model => model.Title, ViewBag.Titles as SelectList)

DropDownList正确填充所有预期的职位,它只是没有根据 model.Title 选择正确的职位。我做错了什么?

更新

在我的代码中似乎还有其他可能出错的地方,所以我把它全部放在这里,看看我做错了什么。

控制器:

public ActionResult Edit(int id = 0)
    {
        StaffMember staffmember = StaffMember.SelectByID(id); // gets staff member from db

        ViewBag.Titles = new SelectList(JobTitle.SelectAll(), "Name", "Name", staffmember.Title); // JobTitle.SelectAll() returns List<JobTitle>

        StaffEditModel model = new StaffEditModel();
        model.ID = staffmember.ID;
        model.ClientID = staffmember.ClientID;
        model.FirstName = staffmember.FirstName;
        model.MiddleInitial = staffmember.MiddleInitial;
        model.LastName = staffmember.LastName;
        model.Title = staffmember.Title;
        model.Phone = staffmember.Phone;
        model.Email = staffmember.Email;
        model.Birthday = staffmember.Birthday;
        model.HireDate = staffmember.HireDate;
        model.Biography = staffmember.Biography;

        if (staffmember == null)
        {
            return HttpNotFound();
        }
        return View(model);
    }

型号:

public class StaffEditModel
{
    public int ID { get; set; }

    public int ClientID { get; set; }

    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Display(Name = "Middle Initial")]
    public string MiddleInitial { get; set; }

    [Required]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    public string Title { get; set; } // this is the property I'm trying to show in DropDown

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public string Birthday { get; set; }

    [Display(Name = "Hire Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public string HireDate { get; set; }

    public string Email { get; set; }

    [MaxLength(14)]
    public string Phone { get; set; }
    public string Biography { get; set; }
}

查看:

@Html.DropDownListFor(model => model.Title, new SelectList(ViewBag.Titles,"Value","Text", Model.Title))

2 个答案:

答案 0 :(得分:3)

这应该有效。 您可以从控制器

传递ViewBag.Titles List<SelectListItem>
var jobList = new List<SelectListItem>();
foreach (var job in jobTitles)
{
    var item = new SelectListItem();
    item.Value = job.PropertyName; //the property you want to display i.e. Title
    item.Text = job.PropertyName;
    jobList.Add(item);
}
ViewBag.Title = jobList;

然后在视图中

@Html.DropDownListFor(model => model.Title, new SelectList(ViewBag.Titles,"Value","Text", Model.Title))

答案 1 :(得分:1)

我知道我在这方面迟到了,但我遇到了类似的问题,并且认为我会添加我发现的内容。

我还没弄明白为什么 - 我还在研究(这就是我在这里的结果) - 但我认为这与你使用 Title <这个词有关/ em>的

我有完全相同的情况,一旦我将模型更改为 CustomerTitle 而不是标题,事情按预期工作。

最初的想法是模型绑定器在DOM中的其他位置找到 Title 并且被绊倒。完全猜测。如果我有更多时间,我会继续挖掘原因