3

我是 MVC 的新手,正在尝试一个测试应用程序来弄湿我的脚。此应用程序的一部分是生成带有下拉框的表单。我用

@Html.DropDownListFor() 来生成这个,在创建表单上下拉工作正常。但是当我进入编辑表单时,模型值没有传递给下拉菜单。

选择列表项

 public static string[] OnOffList()
    {
        var ret = new string[] { "On", "Off" };
        return ret;
    }

表格代码

@Html.DropDownListFor(model => model.ServiceCondition, new SelectList(OnOffDropDownHelper.OnOffList()))

对于这个例子,假设 model.ServiceCondition = "Off"。

出于某种原因,每当我调用此表单时,下拉值始终为“开”,它似乎完全忽略了模型值。

我也试过这个

@Html.DropDownListFor(model => model.ServiceCondition, new SelectList(OnOffDropDownHelper.OnOffList(), "Off"))

强制“关闭”值,但它仍然显示为“打开”作为下拉列表中的选定值。

我想重申一下,我确实知道模型值为“关闭”,并且我使用相同的 @Html.DropDownListFor() 创建了一个相同的“创建”表单,它能够将值传递给模型就好了。

就像我说的,我是 MVC 的新手,所以任何帮助都将不胜感激。

谢谢。

4

3 回答 3

3

我认为你必须设置IsSelected属性。这总是对我有用:

首先,只需在模型中放置一个属性来整理 View 代码:

public List<SelectListItem> OnOffDDL
{
    get
    {
        return OnOffDropDownHelper.OnOffList()
            .Select(s => new SelectListItem
                         {
                             Text = s,
                             Value = s,
                             Selected = ServiceCondition == s
                         })
            .ToList();
    }
}

然后做:

@Html.DropDownListFor(model => model.ServiceCondition, model.OnOffDDL)
于 2013-05-08T13:15:31.403 回答
1

这可能有点矫枉过正,但如果您的模型可以根据模型本身有不同的选项(即使现在它只是打开和关闭),这将很有帮助。就像将来如果某些项目可能具有“待机”模式等,您将从数据库中获取该特定项目的实际选项。

使用 SelectList 作为源,因此您的模型可以具有:

public List<SelectListItem> OnOffList{ get; set; }

然后在控制器中填充模型,如:

model.OnOffList.Add(new SelectListItem()
{
    Text = "On",
    Value = "On"
});

...ETC。

然后您可以设置选定的项目,如:

@Html.DropDownListFor(m => m.ServiceCondition, new SelectList(Model.OnOffList(), "Value", "Text", Model.ServiceCondition))
于 2013-05-08T14:08:54.267 回答
0

原来是我的菜鸟错误。

曾经设计过数据库的人将字段 ServiceCondition 设置为 nchar(8),在“on”、“Off”值的末尾留下空白。

相关字段中的 .Trim() 解决了该问题。

非常感谢您的帮助。

于 2013-05-08T14:25:25.320 回答