C# @Html.DropDownList不选择值

C# @Html.DropDownList不选择值,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,在asp.net mvc 4 web应用程序中,我使用viewmodel将数据加载到页面,编辑部分数据并更新相关模型 目前,我一直在使用@Html.DropDownList,虽然它在下拉列表中显示得很好,但它不会根据您选择的内容进行更改/更新 你知道为什么会这样吗?我做错了什么 下面是我的代码: 控制器: public ActionResult RequestDetails(int id) { var details = from s in SystemDB.Events.ToList()

在asp.net mvc 4 web应用程序中,我使用viewmodel将数据加载到页面,编辑部分数据并更新相关模型

目前,我一直在使用
@Html.DropDownList
,虽然它在下拉列表中显示得很好,但它不会根据您选择的内容进行更改/更新

你知道为什么会这样吗?我做错了什么

下面是我的代码:

控制器:

public ActionResult RequestDetails(int id)
{
  var details = from s in SystemDB.Events.ToList()
                where s.BookingId == id
                orderby s.EventId descending
                select s;
  List<RequestDetailsViewModel> result = new List<RequestDetailsViewModel>();
  foreach (var item in details)
  {
    RequestDetailsViewModel model = new RequestDetailsViewModel();
    model.Event.EventId = item.EventId;
    model.Event.EventLeader = item.EventLeader;
    model.Event.EventStartDateTime = item.EventStartDateTime;
    model.Event.EventEndDateTime = item.EventEndDateTime;
    model.Event.Room.RoomNumber = item.Room.RoomNumber;
    model.Event.EventTotalCost = item.EventTotalCost;
    model.Event.Booking.BookingId = item.BookingId;              
    result.Add(model);              
  }
  Booking booking = SystemDB.Bookings.Find(id);
  var statuscodes = from s in SystemDB.StatusCodes.ToList()
                    where s.StatusCodeId != 1
                    select s;
  ViewBag.StatusCodeList = new SelectList(statuscodes, "StatusCodeId", "StatusCodeName", booking.StatusCodeId);
  return View(result);
}

[HttpPost]
[ActionName("RequestDetails")]
public ActionResult PostRequestDetails(int id)
{
  var details = from s in SystemDB.Events.ToList()
                where s.BookingId == id
                orderby s.EventId descending
                select s;
  List<RequestDetailsViewModel> result = new List<RequestDetailsViewModel>();
  foreach (var item in details)
  {
    RequestDetailsViewModel model = new RequestDetailsViewModel();
    model.Event.EventId = item.EventId;
    model.Event.EventLeader = item.EventLeader;
    model.Event.EventStartDateTime = item.EventStartDateTime;
    model.Event.EventEndDateTime = item.EventEndDateTime;
    model.Event.Room.RoomNumber = item.Room.RoomNumber;
    model.Event.EventTotalCost = item.EventTotalCost;
    model.Event.Booking.BookingId = item.BookingId;             
    result.Add(model);
 }
 Booking booking = SystemDB.Bookings.Find(id);
 var statuscodes = from s in SystemDB.StatusCodes.ToList()
                   where s.StatusCodeId != 1
                   select s;
 ViewBag.StatusCodeList = new SelectList(statuscodes, "StatusCodeId", "StatusCodeName", booking.StatusCodeId);
  if (ModelState.IsValid)
  {
    SystemDB.Entry(booking).State = EntityState.Modified;
    SystemDB.SaveChanges();
    return RedirectToAction("RequestList", "Admin");
  }                
  return View(result);
}
视图:

@model IEnumerable
@ActionLink(“管理请求”、“请求列表”)/事件列表
@使用(Html.BeginForm(“RequestDetails”、“Admin”、FormMethod.Post))
{ 
预订日期:@ViewBag.Date
总成本:英镑@ViewBag.BookingTotalCost
请求者:
状态:@Html.DropDownList(“StatusCodeList”)
@DisplayNameFor(model=>model.Event.EventLeader)
@DisplayNameFor(model=>model.Event.EventStartDateTime
@DisplayNameFor(model=>model.Event.EventEndDateTime
@DisplayNameFor(model=>model.Event.Room.RoomNumber)
@DisplayNameFor(model=>model.Event.EventTotalCost)
@foreach(模型中的var项目)
{
@DisplayFor(modelItem=>item.Event.EventLeader)
@DisplayFor(modelItem=>item.Event.EventStartDateTime)
@DisplayFor(modelItem=>item.Event.EventEndDateTime
@DisplayFor(modelItem=>item.Event.Room.RoomNumber)
@Html.DisplayFor(modelItem=>item.Event.EventTotalCost)
}
}
@ActionLink(“返回请求”、“请求列表”)
试试这个

 @Html.DropDownList("StatusCodeList", (SelectList) ViewBag.StatusCodeList, "Select")

您的ViewBag.StatusCodeList已经是SelectList的类型。我不认为有理由创建两次SelectList,所以它不应该是:

@Html.DropDownList("StatusCodeList", ViewBag.StatusCodeList) 


您的GET方法正在将
RequestDetailsViewModel
的集合返回到视图中。若要正确呈现该集合以便回发,请对
RequestDetailsViewModel
的类型使用自定义
EditorTemplate
,并将post方法更改为

[HttpPost]
public ActionResult RequestDetails(IEnumerable<RequestDetailsViewModel> model)
在主视图中,需要将
SelectList
传递给
additionalViewData
参数中的模板

@model IEnumerable<RequestDetailsViewModel>
@using(Html.BeginForm())
{
  @Html.EditorFor(m => m, new { StatusCodeList = (SelectList)ViewBag.StatusCodeList })
  <input type="submit" />
}

这是一个错误:DavaBooDIN:“St.Web.MVC。SelectListItem”不包含一个名为“StasuSoCIDID”的属性。错误1’St.Web.MVC .HTMLHelp'没有适用的方法名为“DROPPDRONLIST”,但似乎有一个扩展名的方法。不能动态地扩展扩展方法。nts或在没有扩展方法语法的情况下调用扩展方法。不,这不起作用,根本不选择值您试图绑定到的属性是什么?booking.statuscodeid这真的是您的POST方法吗(只是发回
int id
,而不是
List
)?我尝试发布RequestDetailsViewModel,但没有成功,因为所有内容都为空:[HttpPost][ActionName(“RequestDetails”)]public ActionResult PostRequestDetails(RequestDetailsViewModel viewmodel)发送到视图的模型是
List
,因此POST方法需要是
public ActionResult PostRequestDetails(列表视图模型)
。有点不清楚您想做什么?我不确定这是否是解决方案,我添加了完整视图以帮助您了解我想做的事情:基本上列出与预订相关的所有事件,然后在同一视图上编辑预订,主要是状态下拉列表……这就是我遇到的问题…您所做的编辑与问题或后续评论并不相关。为什么您将所有代码都放在
@Html.BeginForm()
中?您唯一拥有的控件是由
@Html.DropDownList(“StatusCodeList”)生成的
它不绑定任何内容。我最好的猜测是,下拉列表用于过滤您显示的列表?基本上,我在考虑让用户可以在现场编辑每个活动,但顶部显示的预订详细信息除外。这就是为什么我有“一切都是一个表单”…因为您需要一个有很多javascript/jquery代码,但是dropdownlist的用途是什么?您的GET和POST方法看起来几乎相同,很难理解为什么在POST方法中包含所有这些代码。唯一的区别是您根据值获取一个
Booking
,并将其标记为modified(即使您没有以任何方式修改它),然后保存它(为什么?)。如果您没有修改数据,那么它不应该是一篇文章,您可以删除方法中的所有代码,只需将其替换为
return RedirectToAction(“RequestDetails”,new{id=id})
@Html.DropDownList("StatusCodeList", ViewBag.StatusCodeList as SelectList)
[HttpPost]
public ActionResult RequestDetails(IEnumerable<RequestDetailsViewModel> model)
@model RequestDetailsViewModel

@Html.HiddenFor(m => m.Event.Booking.EventId)
@Html.TextBoxFor(m => m.Event.Booking.EventLeader)
....
@Html.DropDownListFor(m => m.Event.Booking.StatusCodeId, (SelectList)ViewData["StatusCodeList"], "-Please select-")
....
@model IEnumerable<RequestDetailsViewModel>
@using(Html.BeginForm())
{
  @Html.EditorFor(m => m, new { StatusCodeList = (SelectList)ViewBag.StatusCodeList })
  <input type="submit" />
}
public ActionResult RequestDetails(int id)
{
  var model = SystemDB.Events
    .Where(e => e.BookingId == id)
    .OrderByDescending(e => e.EventId)
    .Select(e => new RequestDetailsViewModel()
    {
      Event.EventId = e.EventId,
      Event.EventLeader = e.EventLeader,
      ...
      Event.Booking.BookingId = e.BookingId;
      Event.Booking.StatusCodeId = // set this value - if it matches the value of one of the values in the select list, then that option will be selected
    });
  var statuscodes = SystemDB.StatusCodes.Where(s => s.StatusCodeId != 1);
  ViewBag.StatusCodeList = new SelectList(statuscodes, "StatusCodeId", "StatusCodeName"); // don't use 4th parameter
  return View(model);
}