我正在尝试创建一个过滤器下拉列表作为参数传递回我的控制器。我似乎无法获得要呈现的下拉列表。
下面是我的模型:
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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句