我正在尝试使用DropDownList中的用户选择项在我的数据库表中创建一个与DropDownList项相关/链接的新条目(不确定对此有正确的措辞)。
这是我的模型
public class TaskInstance
{
public int Id { get; set; }
public DateTime DueDate { get; set; }
public int HowMany { get; set; }
public Task TaskId { get; set; }
public virtual Task Task { get; set; }
}
public class TaskInstanceViewModel
{
[DataType(DataType.DateTime)]
public DateTime DueDate { get; set; }
public int HowMany { get; set; }
public IEnumerable<SelectListItem> TaskList { get; set; }
public virtual ICollection<Task> Task { get; set; }
}
public class Task
{
public Task()
{
TaskInstance = new HashSet<TaskInstance>();
}
public int Id { get; set;}
public string Name { get; set; }
public string Unit { get; set; }
public virtual ICollection<TaskInstance> TaskInstance { get; set; }
}
控制器
public ActionResult Create()
{
var model = new TaskInstanceViewModel();
model.TaskList = db.Task.ToList().Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
}).ToList();
return View(model);
}
// POST: TaskInstances/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(TaskInstanceViewModel model)
{
if (ModelState.IsValid)
{
var taskinstance = new TaskInstance { DueDate = model.DueDate };
db.TaskInstance.Add(taskinstance);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
查看 - 这是我需要展示的唯一一个我认为,其他只是字段
@Html.DropDownListFor(x => Model.TaskList, (SelectList)Model.Task)
在控制器上显示var taskinstance = new TaskInstance { DueDate = model.DueDate };
我需要使用用户选择的项目,但我不知道如何获取它,我查看过很多帖子,但大部分都是是如何使DropDownList首先使用它而不是如何使用它(使用新数据库条目作为另一个表的链接)。
我还想提一下,我还是MVC的新手,所以请随时指出我是否采取了错误的方式
答案 0 :(得分:2)
添加int类型的新属性以从下拉列表中存储所选任务。请记住视图模型特定于视图。因此,在视图模型中,仅保留视图中绝对需要的属性。
public class TaskInstanceViewModel
{
public DateTime DueDate { get; set; }
public int HowMany { get; set; }
public IEnumerable<SelectListItem> TaskList { get; set; }
public int SelectedTask {set;get;} // new property
}
在你看来
@model TaskInstanceViewModel
@using(Html.BeginForm())
{
<label> How many</label>
@Html.TextBoxFor(s=>s.HowMany)
<label>Due date</label>
@Html.TextBoxFor(s=>s.DueDate)
<label>Task</label>
@Html.DropDownListFor(s => s.SelectedTask, Model.TaskList)
<input type="submit" />
}
在您的HttpPost操作中,您可以使用SelectedTask
属性值,该值将选择任务的ID
[HttpPost]
public ActionResult Create(TaskInstanceViewModel model)
{
if (ModelState.IsValid)
{
var taskinstance = new TaskInstance { DueDate = model.DueDate ,
TaskId=model.SelectedTask };
db.TaskInstance.Add(taskinstance);
db.SaveChanges();
return RedirectToAction("Index");
}
model.TaskList = db.Task.ToList().Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
}).ToList();
return View(model);
}
答案 1 :(得分:1)
在我看来,您需要指向表示下拉列表中所选项目的属性。下拉项目为IEnumerable<SelectListItem>
为什么所选项目不是SelectListItem
类型的属性?
向视图模型添加属性:
public class TaskInstanceViewModel
{
[DataType(DataType.DateTime)]
public DateTime DueDate { get; set; }
public int HowMany { get; set; }
public IEnumerable<SelectListItem> TaskList { get; set; }
public virtual ICollection<Task> Task { get; set; }
//add this property:
public SelectListItem SelectedItem { get; set; }
}
修改视图:
@Html.DropDownListFor(x => Model.TaskList, Model.SelectedItem )