我正在尝试使用我的数据库填充组合框。我正在使用MVC4和实体框架。目前我的代码所处的位置,组合框中充满了Nova.Models.Clients。我希望填写实际的公司名称。
这是我的模特:
public class Clients
{
[Key]
public int ClientId { get; set; }
public string CompanyName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public ICollection<Estimates> Estimates { get; set; }
public ICollection<Contracts> Contracts { get; set; }
}
这是我的控制器:
public ActionResult EditClients()
{
return View();
}
这是我的观点:
@using Nova.Models
@model Nova.Models.Clients
@{
var context = new NovaDb();
var clients = context.Clients.OrderBy((x => x.CompanyName));
}
div class="control-group">
@Html.LabelFor(x => x.CompanyName, new { @class = "control-label" })
<div class="controls">
@Html.DropDownListFor(x => x.CompanyName, new SelectList(clients), new { @class = "input-xlarge" })
</div>
</div>
这是我的第一个真正的MVC项目,我之前没有碰过这个。和我的好友说话后,我有点困惑。我收集了我应该将我的数据访问权限放在控制器而不是视图中,但无论如何,它仍然可以工作。
任何帮助都将不胜感激。
答案 0 :(得分:1)
我建议使用单独的视图模型(与您的域模型不同,与您的Entity Framework poco对象不同)。这造成了关注点的分离。也就是说,您可以在视图模型上使用以下内容:
public class ClientViewModel
{
public int ClientId { get; set; }
public string CompanyName { get; set; }
public IEnumerable<string> CompanyNames { get; set; }
// Any other properties here, only include those needed by the view
}
您的控制器会将可能的公司名称列表填充到视图模型的CompanyNames
属性中(同时将其他所需的视图模型属性从您的域模型复制到您的视图模型),此列表将是用作下拉列表的可能值。 CompanyName
属性将用于存储选定的值。
您的观点中的下拉列表:
@Html.DropDownListFor(x => x.CompanyName,
new SelectList(Model.CompanyNames),
new { @class = "input-xlarge" });
如您所说,请确保您的数据访问权限在您的控制器中(如果不是单独的服务层)。
答案 1 :(得分:0)
尝试在ViewBag中传递选择列表
public ActionResult EditClients()
{
var context = new NovaDb();
ViewBag.ClientList = (from c in context.Clients
select new SelectListItem()
{
Text=c.CompanyName,
Value=c.ClientId
}).ToList();
return View();
}
在视图中写
@Html.DropDownListFor(x => x.CompanyName,(List<SelectListItem>)ViewBag.ClientList,new { @class = "input-xlarge" });