我已经构建了我的数据库的EF5模型,并将它放在我在MVC项目中引用的单独项目中。我有几个控制器和相关的视图,以允许模型中的数据被视图剃刀到UI。在编辑记录时,附加的模型图中显示了一些外键关系。
我可以在索引视图中看到数据,并且能够导航到创建视图,如下所示:
但是,包含供应商列表的下拉列表仅显示供应商对象中的第一个属性。这不是我想要的观点。
我的GET和POST代码如下所示:
//
// GET: /Property/Create
public ActionResult Create()
{
ViewBag.PropertyType = new SelectList(db.PropertyTypes, "Id", "PropertyTypeName");
ViewBag.VendorID = new SelectList(db.Vendors, "ID", "Title");
return View();
}
//
// POST: /Property/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Property property)
{
if (ModelState.IsValid)
{
db.Properties.Add(property);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.PropertyType = new SelectList(db.PropertyTypes, "Id", "PropertyTypeName", property.PropertyType);
ViewBag.VendorID = new SelectList(db.Vendors, "ID", "Title", property.VendorID);
return View(property);
}
我的视图剃刀代码如下所示:
@model Model.Property
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Property</legend>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyName)
@Html.ValidationMessageFor(model => model.PropertyName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyNumber)
@Html.ValidationMessageFor(model => model.PropertyNumber)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyStreet)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyStreet)
@Html.ValidationMessageFor(model => model.PropertyStreet)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyTown)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyTown)
@Html.ValidationMessageFor(model => model.PropertyTown)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyPostcode)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyPostcode)
@Html.ValidationMessageFor(model => model.PropertyPostcode)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyType, "PropertyType1")
</div>
<div class="editor-field">
@Html.DropDownList("PropertyType", String.Empty)
@Html.ValidationMessageFor(model => model.PropertyType)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.VendorID, "Vendor")
</div>
<div class="editor-field">
@Html.DropDownList("VendorID", string.Empty)
@Html.ValidationMessageFor(model => model.VendorID)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
任何人都可以帮我解决方案,将下拉列表中显示的属性更改为另一个(我在模型中创建了一个计算字段,因为我认为可能更容易显示为下拉列表的值)或控制器的create动作中模型中显示的其他名称字段的串联,以便视图在下拉列表中移动信息?
非常感谢,
杰森。
修改
我现在按照建议将我的创建操作更改为以下内容:
public ActionResult Create()
{
ViewBag.PropertyType = new SelectList(db.PropertyTypes, "Id", "PropertyTypeName");
ViewBag.VendorID = new SelectList(db.Vendors.Select(v => new SelectListItem
{
Value = v.ID,
Text = string.Format("{0} {1} {2}", v.Title, v.Firstname, v.Secondname)
}), "Text", "Value");
return View();
}
但现在它不会编译。我试图分配给Value的m.id属性是一个int(它是供应商表的主键),但是我无法将其转换为字符串,否则Razor引擎会在呈现视图时引发错误。 / p>
关于如何克服这个看似简单的任务的更多想法或帮助。
再次感谢。
学家
答案 0 :(得分:2)
您的下拉列表会准确显示您要显示的内容。
ViewBag.VendorID = new SelectList(db.Vendors, "ID", "Title", property.VendorID);
您告诉它使用Title
对象的Vendor
属性作为显示文本。如果那不是你想要的,那么指定另一个属性。如果您想要一组属性,例如名字和姓氏,则必须使用SelectList
构建SelectListItem
:
ViewBag.VendorID = new SelectList(db.Vendors.Select(m => new SelectListItem
{
Value = m.ID,
Text = string.Format("{0} {1}", m.FirstName, m.LastName)
}, "Value", "Text", property.VendorID);
答案 1 :(得分:0)
试试这个
@Html.DropDownList("VendorID", (SelectList)ViewBag.VendorID)
@Html.DropDownList("PropertyType", (SelectList)ViewBag.PropertyType)