如何正确地将ViewDownList的SelectedValue从View发送到控制器?视图模型

时间:2016-04-02 22:41:50

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

我尝试了许多解决方案,例如thisthisthis。但是,它不起作用,因为其他示例使用ViewBag,但我使用的是ViewModel

我有ScheduleViewModel

public class ScheduleViewModel
{
    public int[] SelectedValues { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }       
    public Schedule OneSchedule { get; set; }
}

控制器操作List

    public ActionResult List(ScheduleViewModel scheduleVM)//scheduleVM is always NULL
    {                             
        var model = new ScheduleViewModel();
        IList<SelectListItem> listTime = new List<SelectListItem>();
        DateTime time = DateTime.Today;            
        for (DateTime _time = time; _time < time.AddDays(5); _time = _time.AddDays(1)) //from 16h to 18h hours
        {
            listTime.Add(new SelectListItem() { Value = _time.ToShortDateString(), Text = _time.ToShortDateString() });
        }

        model.Values = listTime;
        return View(model);
    }

和查看:

model CinemaAppl.WebUI.Models.ScheduleViewModel


@using (Html.BeginForm())
{
    <p>       
        @Html.DropDownListFor(m => m.SelectedValues, Model.Values)
        <input type="submit" value="Filter" />
    </p>
}

如何通过按钮点击将DropDownList的SelectedValue从View正确发送到控制器?是否可以发送不带AJAX的值并创建POST方法?如果无法实现,则可以使用AJAXPOST方法。

我想要的是:

我想要DropDownListFor,我只能选择一个DateTime值,我可以将其发送到ActionResult List()

我可以看到所有DateTime值:

enter image description here

1 个答案:

答案 0 :(得分:6)

根据评论,

  

我想要DropDownListFor,我只能选择一个DateTime值   我可以发送到ActionResult List()

由于您只想选择一个项目,因此不需要数组。还要将类型(获取所选项的属性的 )更改为有效类型,以便模型绑定能够将日期(字符串)值映射到视图模型的属性。

public class ScheduleViewModel
{
    public DateTime? SelectedDate { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }       
    public Schedule OneSchedule { get; set; }
}

现在在你看来,

@model ScheduleViewModel
@using(Html.BeginForm())
{
   @Html.DropDownListFor(x => x.SelectedDate, Model.Values)
   <input type="submit" />
}

在你的HttpPost行动中,

[HttpPost]
public ActionResult List(ScheduleViewModel model)
{
   if(model.SelectedDate!=null)  
   {
     //Safe to access model.SelectedDate.Value now :)
   }
   // to do : Return something
}