在MVC3.net中使用复合键记录填充DropdownList?

时间:2011-10-07 14:33:40

标签: asp.net-mvc-3 composite-key

我不知道我是否遗漏了一些明显的东西,但我真的想要获取与复合键相关的客户名称。

控制器代码:

Job job = db.Jobs.Find(id);


            ViewBag.jobClientsList = new SelectList(job.JobClients.ToList(), "ClientNumber", "ClientNumber");

查看代码:

<%: Html.DropDownList("ClientNumber", ViewData["JobClientsList"] as SelectList)%>

型号:

namespace Sample.CustomerService.Domain {
using System.ComponentModel.DataAnnotations;

public class JobClient {
    public JobClient() { }
    [Key]
    [Column(Order = 1)]
    public virtual int JobNumber { get; set; }
    [Key]
    [Column(Order = 1)]
    public virtual int ClientNumber { get; set; }
    public virtual Client Client { get; set; }
    public virtual Job Job { get; set; }
}

}

此代码有效,但我在下拉列表中获得的只是一堆数字。我真正想要的是与数字相关的客户名称,但我真的不知道该怎么做!我一直在四处寻找!

4 个答案:

答案 0 :(得分:0)

默认情况下,选择列表会显示标记为[Key]

的属性
  

&lt;%:Html.DropDownList(“ClientNumber”,   ViewData [“JobClientsList”]。客户端为SelectList)%&gt;

应该打印客户端名称(假设客户端对象上的主键是他们的名字,否则你需要ViewData["JobClientsList"].Client.FullName

之类的东西

最好的解决方案是使用ViewModel而不是使用ViewBag或ViewData,这有助于避免现在和将来的许多麻烦。

答案 1 :(得分:0)

我过去为DropDownLists工作所做的是将List保存到Session变量,然后在实际的DropDownList中创建我的SelectList。 控制器:

Job job = db.Jobs.Find(id).ToList();  
ViewBag.jobClientList = job;  

查看:

<%: Html.DropDownList("ClientNumber", new SelectList((If you view is strongly typed, put that here) ViewData["JobClientsList"],"ClientNumber","ClientNumber")%>

这可能措辞不力,所以我想我可以澄清是否需要

答案 2 :(得分:0)

重新阅读您的问题后,您的答案似乎比预期的更简单。 查看选择列表类http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist.aspx

你在控制器中使用的构造函数是错误的,它应该是:

ViewBag.jobClientsList = new SelectList(job.JobClients.ToList(), "ClientNumber", "Client");

您正在将selectList的文本值设置为“ClientNumber”,这就是为什么您有一个数字列表而不是名称!

答案 3 :(得分:0)

任何寻求解决方案的人,请尝试以下操作:

在您的控制器中:

1)获取列表:

var allCountries = countryRepository.GetAllCountries();

2)定义一个变量:

var items = new List<SelectListItem>();

3)循环每个项目:

foreach(var country in allCountries)
 {
    items.Add(new SelectListItem() {
    Text = coutry.Name,
    Value = Country.Id.ToString(),
    // Put all sorts of business logic in here
    Selected = country.Id == 13 ? true : false
 });
}

model.Countries =项目;

您认为:

@Html.ActionLink("StringToDisplay", "actionName", "controllerName", new SelectList(Model.Countries, "Value","Text"),"--Please Select--", new{@class="form-control"})

更不用说Model应该具有

的属性
public IEnumerable<Country> Countries {get; set;}