从DropDownListFor MVC获取选定的索引

时间:2014-07-07 13:38:26

标签: c# asp.net-mvc enums

我正在尝试从我的mvc视图中的下拉列表中获取所选项目的索引。我使用枚举填充了ddl的内容,代码如下所示:

@Html.DropDownListFor(x => x.SelectedStateId,  Enum.GetNames(typeof(BTSWeb.Models.States)).Select(e => new SelectListItem { Text = e }),"--Market--",new { style = "width: 80px;font-size:85%;border-radius: 6.5px 6.5px 6.5px 6.5px"})

这样你们就知道我的模型类中定义了枚举:

public enum States { ANY, FL, TX, GA, NE };

我的控制器如下所示:

 public ActionResult Index()
    {

        Debug.WriteLine("hello");
        var model = new DropDownModel();


        return View(model);
    }
    [HttpPost]
    public ActionResult Index(DropDownModel model)
    {
        // Get the selected value
        int stateId = model.SelectedStateId;
        int paymentTypeId = model.SelectedBillTypeId;

        BillingToolInterface_1.check.a = stateId;
        BillingToolInterface_1.check.b = paymentTypeId;

        //System.Diagnostics.Debug.WriteLine("hello");

        Debug.WriteLine(stateId.ToString());

        return View();
    }

    public ActionResult About()
    {

        return View();
    }

按下视图中的提交按钮后,我在调试控制台上打印selectedstateid的值。但它为每个选定的值显示“0”。它应显示1,2,3,依此类推,同时在我的状态下拉列表中选择相应的值。

PS:ddl - >下拉列表

1 个答案:

答案 0 :(得分:1)

问题在于,当您创建选择列表时,您只需指定文本值。

@Html.DropDownListFor(x => x.SelectedStateId,  Enum.GetNames(typeof(BTSWeb.Models.States)).Select(e => new SelectListItem { Text = e }),"--Market--",new { style = "width: 80px;font-size:85%;border-radius: 6.5px 6.5px 6.5px 6.5px"})

当您在浏览器中运行此类代码时,您会看到:

enter image description here

修改代码时如下:

@Html.DropDownListFor(x => x.States, Enum.GetNames(typeof(WebApplication1.Controllers.States)).Select(e => new SelectListItem { Text = e, Value = ((int)Enum.Parse(typeof(WebApplication1.Controllers.States), e)).ToString() }), "--Market--", new { style = "width: 80px;font-size:85%;border-radius: 6.5px 6.5px 6.5px 6.5px" })

现在,您还传递了枚举值:

enter image description here

您会注意到选择列表的呈现HTML如何变化?你现在有一个价值物业。

我已经编写了一个解释它的演示项目(我尽可能保持与您的代码尽可能接近)。

首先是枚举:

public enum States { ANY, FL, TX, GA, NE };

然后是模型:

public class DropDownModel
{
    public States States = new States();
    public int SelectedStateID { get; set; }
}

控制器:

public class DefaultController : Controller
{
    public ActionResult Index()
    {
        var model = new DropDownModel();

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(DropDownModel model)
    {
        // Get the selected value

        return View();
    }
}

现在有了观点:

@using (Html.BeginForm("Index", "Default", FormMethod.Post))
{
    @Html.DropDownListFor(x => x.SelectedStateID, Enum.GetNames(typeof(WebApplication1.Controllers.States)).Select(e => new SelectListItem { Text = e, Value = ((int)Enum.Parse(typeof(WebApplication1.Controllers.States), e)).ToString() }), "--Market--", new { style = "width: 80px;font-size:85%;border-radius: 6.5px 6.5px 6.5px 6.5px" })

    <input type="submit" name="SaveButton" value="Save" />
}

基本上,他们都是。 现在,运行您的应用程序,并在下拉列表中选择第3个元素(这应该是&#39; TX&#39;)。

当您再次查看传递给控制器​​的模型属性时,您将无法获得以下信息:

enter image description here

您会看到States具有INCORRECT值,但所选索引属性为2.这是正确的,因为以下内容:

在你的下拉列表的声明中,你将它绑定到SelectedStateId。

2的值也是正确的,因为没有值的枚举从第一个元素的0开始,并为每个后续元素添加1。

现在需要状态时,可以将整数值(2)转换为枚举值。

所以,很长的帖子,但我希望它有所帮助。