Afternoon Folks,
我是MVC 5和C#的新手,有一个包含多个字段和下拉框的简单表单。我已经将CRUD方法用于实体框架,并且可以在系统中成功查看和创建新记录。
我唯一的问题是我有一个“标题”下拉列表链接到实体框架并将这些标题填充到列表中。当我加载我的网页时,我现在可以在下拉列表中看到可用的标题,但是在提交表单时,除“标题”字段之外的所有值都会提交到数据库中。
当我调试我的程序时,无论我选择什么,该字段都显示为空。
我已经按照以下教程来完成这项工作并环顾网络,但我正在寻找解决方案。
我的模型中有两个表,一个名为'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
答案 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" })