从 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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章