【问题标题】:Building a DropDownList in the Model?在模型中构建一个下拉列表?
【发布时间】:2012-08-25 02:37:36
【问题描述】:

我有一个服务层,它公开了一个方法,该方法返回一个名为 GetStates 的列表。

public List<StateObject> GetStates()

我的状态对象只是我创建的一个自定义对象:

public class StateObject
{
    public int stateId { get; set; }
    public string description { get; set; }
    public Boolean isDefault { get; set; }
}

在我的模型中,我正在尝试创建一个模型,用于显示和修改任务屏幕。这将用于处理下拉框的显示和选择,这将提供可用于我的任务的状态列表。所以,我的模型看起来像这样(删除了我们不关心的属性 - 它比这个大一点:

public class TaskModifyModel
{
    public int stateId { get; set; }
    public string state { get; set; }

    public SelectList states { get; private set; }

    public TaskModifyModel()
    {

        states = new SelectList(
            (new ReferenceService().GetStates()),
            "stateId",
            "description",
            1);

    }
}

所以,stateId 保存了选中状态,state 保存了选中状态的文字描述。在构造函数中,我试图为视图创建一个 states SelectList... 并填充它。

在视图中,然后我尝试显示下拉列表:

@Html.DropDownListFor(m=>m.stateId, new SelectList(Model.states, "stateId", "description", Model.priorityId))

这失败了,令人沮丧。

DataBinding:“System.Web.Mvc.SelectListItem”不包含名为“stateId”的属性。

我已经搜索过,我认为我这样做是正确的,但错误表明我不是……很清楚。 :) 有人可以指导我为什么它不起作用,而且,这是正确的做事方式吗?

编辑: 在下面的帮助之后,它现在可以工作了。如果我正在创建一个新任务(taskId==0),那么我必须获取存储在我的数据库中的下拉列表的默认值......那么,这干净吗?这是我的对象的工作构造函数:

公共TaskModifyModel() { var referenceService = new ReferenceService(); var p = referenceService.GetPriorities(); var s = referenceService.GetStates();

    var defaultP = (from a in p where a.isDefault select a).FirstOrDefault();
    var defaultS = (from a in s where a.isDefault select a).FirstOrDefault();

    priorities = new SelectList(
        (p),
        "priorityId",
        "description"
        );
    priorityId = taskId == 0 ? defaultP.priorityId : priorityId;

    states = new SelectList(
        s,
        "stateId",
        "description");
    stateId = taskId == 0 ? defaultS.stateId : stateId;

}

可以吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 html.dropdownlistfor


    【解决方案1】:

    您的 public SelectList states { get; private set; } 已经是一个 SelectList,因此您无需在视图中再次投射它。

    试试这个:

    @Html.DropDownListFor(m=>m.stateId, Model.states)
    

    在您的 ViewModel 中,删除参数“SelectedValue”。 @Html.DropDownListFor 会将下拉菜单初始化为正确的值。

    public class TaskModifyModel
    {
        public int stateId { get; set; }
        public string state { get; set; }
    
        public SelectList states { get; private set; }
    
        public TaskModifyModel()
        {
    
            states = new SelectList(
                (new ReferenceService().GetStates()),
                "stateId",
                "description");
        }
    }
    

    【讨论】:

    • 太棒了!这似乎奏效了。我只需要弄清楚如何设置“选定项目”。我会RTF。 :)
    • 感谢 Alexandre - 但所选项目不起作用。我在模型中设置它,当我调试时,设置了选定的项目,但是当它呈现时,从不使用“选定”,它只是默认为列表中的第一项。
    • 糟糕!对不起,它确实有效!我不需要设置选中项,只要正确设置属性值即可。谢谢!在职的。更新了我现在拥有的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2020-02-16
    • 2019-04-07
    相关资源
    最近更新 更多