在模型中构建DropDownList?

时间:2012-08-25 02:37:37

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

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

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保存所选状态的文本描述。在构造函数中,我试图为视图创建状态SelectList并填充它。

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

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

这是失败的,令人沮丧。

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

我已经搜索过了,我以为我是以正确的方式做到这一点,但错误说我不是......显然。 :)有人可以指导我为什么它不起作用,而且,这是正确的做事方式吗?

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

public 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;

}

可以吗?

1 个答案:

答案 0 :(得分:2)

您的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");
    }
}