MVC下拉选项在调试模式下显示为“null”

时间:2017-01-11 12:31:59

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

Afternoon Folks,

我是MVC 5和C#的新手,有一个包含多个字段和下拉框的简单表单。我已经将CRUD方法用于实体框架,并且可以在系统中成功查看和创建新记录。

我唯一的问题是我有一个“标题”下拉列表链接到实体框架并将这些标题填充到列表中。当我加载我的网页时,我现在可以在下拉列表中看到可用的标题,但是在提交表单时,除“标题”字段之外的所有值都会提交到数据库中。

当我调试我的程序时,无论我选择什么,该字段都显示为空。

我已经按照以下教程来完成这项工作并环顾网络,但我正在寻找解决方案。

Link to tutorial

我的模型中有两个表,一个名为'Title',另一个名为'Client Record'。

由于我已经使用了数据库第一种方法而不是代码,所以我将这两种数据库模型合并为一种:

namespace EDT_Test.Models.ViewModels
   {
   public partial class Marie_Testing
   {
    [Display(Name = "Client Ref:")]
    public int id { get; set; }

    [Display(Name = "Created By:")]
    public string CreatedBy { get; set; }

    public List<Title> allTitles { get; set; }

    [Required]
    [Display(Name = "Surname:")]
    public string Surname { get; set; }

    [Display(Name = "Additional Surname:")]
    public string Surname2 { get; set; }

    [Required]
    [Display(Name = "Forename:")]
    public string Forename1 { get; set; }

    [Display(Name = "Additional Forename:")]
    public string Forename2 { get; set; }

生成的Entity Framework模型如下所示:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace EDT_Test.Models
{
    using System;
    using System.Collections.Generic;

    public partial class ClientRecord
    {
        public int id { get; set; }
        public string CreatedBy { get; set; }
        public string Title { get; set; }
        public string Surname { get; set; }
        public string Surname2 { get; set; }
        public string Forename1 { get; set; }
        public string Forename2 { get; set; }
    }
}

自动创建模型和Marie_Testing模型之间Title字段的唯一区别是我已将Title字段从字符串更改为列表项。

我的Create.cshtml包含一个标题下拉列表的div,看起来像这样(这链接到我的名为Marie_Testing的模型,而不是由实体框架创建的自动生成的模型:

<div class="form-group">
    @Html.LabelFor(model => model.allTitles, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        <select id="titleid" name="titlename" class="form-control">
            @foreach (var item in Model.allTitles)
            {
                <option value="@item.id">@item.Title1</option>
            }
        </select>
    </div>
</div>

我的ClientRecordsController代码是:

 // GET: ClientRecords/Create
    public ActionResult Create()
    {
        ////set the defaults (dropdown) of the page for the ceaton of a new record.
        Marie_Testing vmPopulateData = new Marie_Testing();

        List<Title> titles = (from t in db.Titles select t).ToList();
        //List<Title> titles = Title.Select(t => new{t.id, t.Title}.ToString.ToList());
        vmPopulateData.allTitles = titles;

        return View(vmPopulateData);
    }

    // POST: ClientRecords/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "id,CreatedBy,Title,Surname,Surname2,Forename1,Forename2")] ClientRecord clientRecord)
    {
        if (ModelState.IsValid)
        {
            db.ClientRecords.Add(clientRecord);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(clientRecord);
    }

我非常感谢任何帮助,因为我不明白如何看到网页中的下拉列表,但似乎无法获取所选值并将其发布到数据库。

此致 贝蒂B

3 个答案:

答案 0 :(得分:1)

您需要有一个字符串字段来保存下拉列表中选定的值,以便您的视图可以从

更改
<select id="titleid" name="titlename" class="form-control">

<select id="Title" name="Title" class="form-control">

你的视图模型上也会有像这样的标题属性

public string Title{get;set;}

您需要阅读MVC如何将表单绑定到模型以了解其发生的原因。

希望这会有所帮助..

答案 1 :(得分:1)

为什么不试试@Html.DropDownListFor

而不是:

<select id="titleid" name="titlename" class="form-control">
    @foreach (var item in Model.allTitles)
    {
        <option value="@item.id">@item.Title1</option>
    }
</select>

尝试:

@Html.DropDownListFor(x => x.PropertyToBindTo, new SelectList(Model.allTitles, "id", "Title1"), new { @class = "form-control", id = "Title", name = "Title" })

其中x.PropertyToBindTo是您需要从该选择列表中获取的任何值。尝试一下......为了真正了解你需要如何工作,你可能需要稍微玩一下。

答案 2 :(得分:0)

我更喜欢使用这个

C#

List<Titles> oTitlesList = TitlesService.getTitles();
ViewBag.DropDownListBag = new SelectList(oTitlesList , "Id", "Name");

剃刀

@Html.DropDownListFor(model => model.yourModelAtt, @ViewBag.DropDownListBag as SelectList, "Select.....", new { @class = "form-control" })