C# @Html.DropDownList不选择值
在asp.net mvc 4 web应用程序中,我使用viewmodel将数据加载到页面,编辑部分数据并更新相关模型 目前,我一直在使用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()
@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);
}