在MVC

时间:2015-12-27 03:41:30

标签: c# asp.net asp.net-mvc

我正在尝试使用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的新手,所以请随时指出我是否采取了错误的方式

2 个答案:

答案 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 )
相关问题