如何在DropDownFor的SelectList中设置所选项?

时间:2013-04-02 21:45:20

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

我是MVC的新手,但我已经阅读了有关此主题的几个问题。但是,没有一个答案可以解决我的问题。这是我的代码(只是相关的属性):

C#Classes

public class Customer
{
    public int CustomerId { get; internal set; }
    public string Name { get; set; }
}

public class Project
{
    public int ProjectId { get; internal set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Comment { get; set; }

    public Customer CurrentCustomer { get; set; }
}

控制器类

public ActionResult Edit(int id)
{
    Project item = projectRepository.Get(id);

    ViewBag.AllCustomers = new SelectList(
        new CustomerRepository().Get(), // Returns a List<Customer> of all active customers.
        "CustomerId",
        "Name",
        (object) item.CurrentCustomer.CustomerId);

    return View(item);
}

查看

<div class="editor-label">
    @Html.LabelFor(model => model.CurrentCustomer)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.CurrentCustomer, (SelectList)ViewBag.AllCustomers, "-- Select a Customer. --")
    @Html.ValidationMessageFor(model => model.CurrentCustomer)
</div>

我在没有使用ViewBag(在View本身中执行SelectList实例化)的情况下尝试了这个,这也没有用。我试过硬编码ID而不是使用CurrentCustomer.CustomerId,但是当我在SelectList本身设置断点时,我发现它正在正确处理所有内容。

所有其他StackOverflow问题都表明上述方法和属性名称应该可以正常工作,但对于我的生活,我无法弄清楚这里有什么问题。我错过了什么?

1 个答案:

答案 0 :(得分:3)

我怀疑您使用的是 EF Code-First 。您犯的错误是尝试将int(id)分配给实体CurrentCustomerdropdownlist仅返回id而不是实体。

您应该向您的操作方法发送ID,然后查找并分配实体(或者可以说只是外键)

在您的模型中添加ID

public class Project
{
    public int ProjectId { get; internal set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Comment { get; set; }

    public Customer CurrentCustomer { get; set; }
    public int CurrentCustomerId { get; set; }
}

在您的视图中

@Html.DropDownListFor(model => model.CurrentCustomerId,
 (SelectList)ViewBag.AllCustomers, "-- Select a Customer. --")