asp.net-mvc - 从 Enum 创建的 MVC Razor DropDownList
问题描述
我正在尝试创建一个过滤器下拉列表以作为参数传递回我的控制器。我似乎无法让下拉列表呈现。
下面是我的模型:
using System;
namespace ShiftPatternConfigurator.Models
{
public class ShiftModel
{
public int ShiftNo;
public string ShiftName;
public DateTime StartTime;
public DateTime FinishTime;
public string Team;
public int Week;
public int CycleWeek = 0;
public string StartDay;
public DateTime StartDate;
}
public enum Month
{
January = 1,
February = 2,
March = 3,
April = 4,
May = 5,
June = 6,
July = 7,
August = 8,
September = 9,
October = 10,
November = 11,
December = 12
}
}
这是我的控制器:
using Oracle.ManagedDataAccess.Client;
using ShiftPatternConfigurator.Models;
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Mvc;
namespace ShiftPatternConfigurator.Controllers
{
public class HomeController : Controller
{
// list to hold the shift data
List<ShiftModel> shiftData = new List<ShiftModel>();
// GET: Index
public ActionResult Index()
{
ViewBag.Title = "Shift Pattern Configurator";
// create the select list to help pick which months shifts to look at
ViewBag.Month = new SelectList(Enum.GetValues(typeof(Month)),"Month", "Month", DateTime.Now.ToString("MMMM"));
// create the shift data to display in the page
return View(GetShiftData(shiftData, ViewBag.Month));
}
[HttpPost]
public ActionResult SelectMonth(SelectList Month)
{
ViewBag.Title = "Shift Pattern Configurator";
ViewBag.Month = Month;
return View(GetShiftData(shiftData, Month));
}
private List<ShiftModel> GetShiftData(List<ShiftModel> shiftData, SelectList monthIn)
{
// get the month enum from our selected value
Month month = (Month)Enum.Parse(typeof(Month), monthIn.SelectedValue.ToString());
DateTime start;
DateTime finish;
// if its the end of the year (December)
if ((int)month == 12)
{
// then show december and january
start = new DateTime(DateTime.Today.Year, (int)month, 1, 0, 0, 0);
finish = new DateTime(DateTime.Today.Year + 1, 2, 1, 0, 0, 0);
}
else
{
start = new DateTime(DateTime.Today.Year, (int)month, 1, 0, 0, 0);
finish = new DateTime(DateTime.Today.Year, (int)month + 1, 1, 0, 0, 0);
}
// build the query (Get shift records that are greater than or equal to today and 2 weeks worth)
StringBuilder oracleQuery = new StringBuilder("SELECT SHIFT_NO, SHIFT_NAME, START_TIME, FINISH_TIME, TEAM, WEEK, CYCLE_WEEK, START_DAY, START_DATE ");
oracleQuery.Append("FROM PROD_KPI.NEW_SHIFTS ");
oracleQuery.Append("WHERE START_DATE BETWEEN :pSTART_DATE AND :pEND_DATE ");
oracleQuery.Append("ORDER BY START_DATE DESC ");
// connection to oracle
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["IFSOracleConnection"].ConnectionString;
OracleConnection conn = new OracleConnection(connectionString);
conn.Open();
// oracle command object and parameters
OracleCommand cmd = new OracleCommand(oracleQuery.ToString(), conn);
cmd.Parameters.Add(new OracleParameter("pSTART_DATE", OracleDbType.Date));
cmd.Parameters[0].Value = start;
cmd.Parameters.Add(new OracleParameter("pEND_DATE", OracleDbType.Date));
cmd.Parameters[1].Value = finish;
// execute the query
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
//object o = reader.IsDBNull(0) ? null : reader.GetValue(0);
ShiftModel shiftRecord = new ShiftModel
{
ShiftNo = reader.GetInt32(reader.GetOrdinal("SHIFT_NO")),
ShiftName = reader.IsDBNull(reader.GetOrdinal("SHIFT_NAME")) ? null : reader.GetString(reader.GetOrdinal("SHIFT_NAME")),
StartTime = reader.GetDateTime(reader.GetOrdinal("START_TIME")),
FinishTime = reader.GetDateTime(reader.GetOrdinal("FINISH_TIME")),
Team = reader.IsDBNull(reader.GetOrdinal("TEAM")) ? null : reader.GetString(reader.GetOrdinal("TEAM")),
Week = reader.GetInt32(reader.GetOrdinal("WEEK")),
CycleWeek = reader.GetInt32(reader.GetOrdinal("CYCLE_WEEK")),
StartDay = reader.IsDBNull(reader.GetOrdinal("START_DAY")) ? null : reader.GetString(reader.GetOrdinal("START_DAY")),
StartDate = reader.GetDateTime(reader.GetOrdinal("START_DATE"))
};
shiftData.Add(shiftRecord);
}
reader.Close();
return shiftData;
}
}
}
这是我的剃刀观点:
@using ShiftPatternConfigurator.Models
@model IEnumerable<ShiftPatternConfigurator.Models.ShiftModel>
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("SelectMonth", "HomeController", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.DropDownList("Month", (SelectList)ViewBag.Month)
<input type="submit" value="SelectMonth" />
}
<table class="table">
<tr>
<th>Shift No</th>
<th>Shift Name</th>
<th>Start Time</th>
<th>Finish Time</th>
<th>Team</th>
<th>Week</th>
<th>Start Day</th>
<th>Start Date</th>
<th></th>
</tr>
@if (Model.Count() > 0)
{
foreach (var item in Model)
{
<tr>
<td>@item.ShiftNo</td>
<td>@item.ShiftName</td>
<td>@item.StartTime</td>
<td>@item.FinishTime</td>
<td>@item.Team</td>
<td>@item.Week</td>
<td>@item.StartDay</td>
<td>@item.StartDate.ToShortDateString()</td>
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
}
else
{
<tr>
<td colspan="10" align="center"><h2>No Data</h2></td>
</tr>
}
</table>
有人可以建议如何创建 DropDownList 对象,以便在提交表单时将 Month 参数传递回我在 HomeController 中选择的月份 ActionResult。
当我在创建 DropDownList 之前运行我的代码并中断时,如果我检查我的 ViewBag.Month,我可以看到一个填充的 SelectList,其中 Selected Value 设置为当前月份。
请指教。
编辑:我收到的错误如下:
System.Web.HttpException:“DataBinding:“ShiftPatternConfigurator.Models.Month”不包含名为“Month”的属性。
解决方案
您可以在答案显示时手动构建选择列表,或者您可以使用内置的 Html 帮助程序Html.EnumDropDownListFor
,这将实现我相信您正在寻找的代码更少。示例用法如下:
public class MyViewModel
{
//Month is an enum here
public Month Month { get; set; }
}
并且您的视图 ( MonthExample.cshtml
) 看起来像:
@model MyProject.MyViewModel
...
@using(Html.BeginForm("MonthExample", "ControllerName", FormMethod.Post))
{
@Html.EnumDropDownListFor(x => x.Month)
<button type="submit">Save</button>
}
...
框架将看到 Month 是一个枚举并自动构建下拉列表的选项,而不是您手动执行此操作。
如果您想查看控制器 get/post 的简单示例,它们可能如下所示:
public ActionResult MonthExample()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult MonthExample(MyViewModel model)
{
//here model.Month will have the selected month from the dropdown list
}
推荐阅读
- python - 如何在 Python 中使用 BeautifulSoup 从 HTML 页面中提取表格内容?
- nginx - nginx HTTP 400 错误请求 - 主机名无效
- java - 如何使 log4j2 使用 Spring Boot 和 Maven 创建不同的日志记录文件
- sql - SQL找不到变量?
- xslt - XSL-FO Region-Body 背景图片
- mail-server - 希望创建刻录机帐户
- python - 使用多个 csv 文件作为 CNN 的测试和训练集
- visual-studio - 是在不同的层中复制多个项目文件,还是在创建 Docker 映像时一次性复制更好?
- javascript - 如何在数字输入字段中添加逗号以获取多个重新编码
- swift - 从集合视图重新加载数据时的多个视图