0

我已经构建了我的数据库的 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")
}

谁能帮助我解决将下拉列表中显示的属性更改为不同属性的解决方案(我在模型中创建了一个计算字段,因为我认为这可能更容易显示为下拉列表的值)或串联控制器的创建操作中模型中显示的其他名称字段,以便下拉列表中的视图移动信息?

非常感谢,

杰森。

编辑

我现在已按照建议将创建操作更改为以下内容:

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 (它是 vendor 表的主键),但我不能将它转换为字符串,否则 Razor 引擎会在呈现视图时引发错误。

关于如何克服这个看似简单的任务的更多想法或帮助。

再次感谢。

J。

4

2 回答 2

2

您的下拉列表准确地显示了您告诉它显示的内容。

ViewBag.VendorID = new SelectList(db.Vendors, "ID", "Title", property.VendorID);

您告诉它使用对象的Title属性Vendor来显示文本。如果这不是您想要的,则指定另一个属性。如果你想要一个属性的组合,比如名字和姓氏,你必须构造你的SelectListusing SelectListItems:

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);
于 2013-09-20T15:43:56.693 回答
0

尝试这个

@Html.DropDownList("VendorID", (SelectList)ViewBag.VendorID)

@Html.DropDownList("PropertyType", (SelectList)ViewBag.PropertyType)
于 2013-09-20T15:49:41.157 回答