足够的MVC是危险的

时间:2013-09-20 15:11:12

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

我已经构建了我的数据库的EF5模型,并将它放在我在MVC项目中引用的单独项目中。我有几个控制器和相关的视图,以允许模型中的数据被视图剃刀到UI。在编辑记录时,附加的模型图中显示了一些外键关系。 enter image description here

我可以在索引视图中看到数据,并且能够导航到创建视图,如下所示:

enter image description here

enter image description here

但是,包含供应商列表的下拉列表仅显示供应商对象中的第一个属性。这不是我想要的观点。

我的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>

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

再次感谢。

学家

2 个答案:

答案 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)