【问题标题】:Getting selected Index from DropDownListFor MVC从 DropDownListFor MVC 中获取选定的索引
【发布时间】:2014-07-07 13:38:25
【问题描述】:

我正在尝试从我的 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 -> 下拉列表

【问题讨论】:

  • 如果我错了,请纠正我,但您没有在下拉列表中设置值?
  • 在填充下拉列表时不会自动处理(在我的情况下来自枚举)。如果不是,在这种情况下我应该如何设置值。
  • 我正在调查。等一下。
  • 您确定您发布的代码正常工作,您的控制器上没有收到异常吗?
  • 我错了,我打错了,对不起

标签: c# asp.net-mvc enums


【解决方案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"})

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

当您像这样修改代码时:

@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" })

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

您会注意到您的选择列表呈现的 HTML 是如何变化的?你现在有一个 value 属性。

我已经编写了一个演示项目来解释它(我试图尽可能接近你的代码)。

先枚举:

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" />
}

基本上,这就是他们的全部。 现在,运行您的应用程序,并在下拉列表中选择第三个元素(这应该是“TX”)。

当您再次查看传入控制器的模型属性时,您会注意到以下内容:

您会看到 States 具有 INCORRECT 值,但所选索引属性具有 2。这是正确的,原因如下:

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

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

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

所以,这篇文章很长,但我希望它有所帮助。

【讨论】:

  • 像魅力一样工作,我现在遇到的新问题是 --Market- 没有显示为默认的 ddl 文本。相反,它显示“任何”作为默认文本。任何想法为什么会发生这种情况。
  • 您会注意到 .Select 函数是一个扩展方法,因此您应该编写自己的扩展方法,该方法返回一个 SelectListItem 对象的 IEnumerable。
  • 不幸的是,我现在不能继续我的研究,但基本上,你应该编写一个扩展方法,返回一个 SelectListItem 的集合。它不应该那么难。另外,如果我的回答对您有任何帮助,请考虑将其标记为已接受。
  • 嗨,是的,它确实有效,但由于某种原因,我无法接受您的回答。一会儿试试。
  • 这很奇怪。但我很高兴你找到了一种方法来为默认值编写扩展方法。也许将其添加为您原始问题中的更新...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多