Asp.net MVC从EditorFor获得价值

时间:2011-02-20 06:10:37

标签: asp.net-mvc

我创建了一个局部视图来处理下拉列表控件。在我的模型中,我有一个成本中心列表的属性。

        [UIHint("SelectionList")]
    public List<SelectListItem> CostCentersList {get; private set;}

我使用了UIHint,因此它知道我想使用我创建的SelectionList.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<SelectListItem>>" %>

&lt;%= Html.DropDownListFor(m =&gt; m,Model)%&gt;

然后,在我的主视图中,我使用以下代码来呈现控件:

<%=Html.EditorFor(m => m.CostCentersList)%>

这是有效的...它呈现控件...但是我有一个问题,让我在调用视图时选择我想要选择的项目。我用一些代码做了这个:

                BudgetDto b = Services.BudgetServices.GetBudgetById(id);
            model = new BudgetViewModel
                        {
                            Amount = b.Amount,
                            BudgetId = id,
                            CostCenterId = b.CostCenterId,
                            Description = b.Name,
                            Deleted = b.Deleted
                        };

            foreach (var i in model.CostCentersList)
                if (i.Value == model.CostCenterId.ToString())
                    i.Selected = true;

然后我返回View(模型)。

按照我的预期渲染控件。问题是,当我单击Submit时,我的Model.CostCenterId为0,而Model.CostCenterList为NULL。我似乎无法从控件中获取所选值。

1 个答案:

答案 0 :(得分:2)

要制作下拉列表,您需要两个属性:一个表示所选值并绑定到该列表,另一个属性列为SelectListItem。在您的情况下,您只有一个列表。所以你需要一个中间视图模型:

public class DropDownViewModel
{
    public string SelectedItemId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

然后在你的视图模型上有:

[UIHint("SelectionList")]
public DropDownViewModel CostCentersList { get; set; }

和您的编辑器模板:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<DropDownViewModel>" %>
<%= Html.DropDownListFor(x => x.SelectedItemId, Model.Items) %>

最后在主视图中:

<%= Html.EditorFor(m => m.CostCentersList) %>

现在您可以使用SelectedItemId属性来设置/获取值。