ASP.NET MVC - Enum未发送到Controller

时间:2013-01-25 14:31:01

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

我有一个DropDropListFor,如下所示:

 using (Ajax.BeginForm("FilterListingsWorkflow", "Listing",
    new {
        categoryguid = Model.SelectedCategoryGuid,
        workflowstatus = Model.SelectedWorkflowStatus,
        entityName = Model.EntityName,
    },
    new AjaxOptions {
        HttpMethod = "POST",
        UpdateTargetId = "listingTable",
        InsertionMode = InsertionMode.Replace
    }))
    {
        <p>Filter listings by Workflow Status:</p>
        @Html.DropDownListFor(m =>
            Model.SelectedWorkflowStatus,
            Enum.GetValues(typeof (WorkflowStatus))
                .Cast<WorkflowStatus>()
                .Select(v =>
                    new SelectListItem {
                        Text = v.ToString(),
                        Value = ((int) v).ToString()
                }),
            new { onchange = "$(this.form).submit()" })
    }

如您所见,有三个对象被发送到控制器:

  • Model.SelectedCategoryGuidModel.SelectedWorkFlowStatusEntityName

WorkFlowStatus是一个枚举,出于某种原因,每当我点击DropDownList中的任何枚举时,它总是成为第一个。

我有三个Enum值插入到DropDownList中:

  • 草稿,已发布和已存档。

所以,每当我点击其中任何一个时,当我将鼠标悬停在Controller中的变量上时,我看到参数变量:workflowstatus始终是Draft(这是第一个)。

有谁知道为什么没有传递CORRECT枚举?

这真让我烦恼......

1 个答案:

答案 0 :(得分:2)

DropDownList的名称为SelectedWorkflowStatus。因此,请确保您的控制器操作采用参数:

这样的参数
[HttpPost]
public ActionResult FilterListingsWorkflow(WorkflowStatus selectedWorkflowStatus)
{
    ...
}

这是您获得正确价值的地方。我可以看到您为表单设置了一些路由值:

new {
    categoryguid = Model.SelectedCategoryGuid,
    workflowstatus = Model.SelectedWorkflowStatus,
    entityName = Model.EntityName,
}

但是不要在动作中查看workflowStatus参数。这个人将包含旧值,即在视图首次呈现时在表单中硬编码的值。 fresh 值存储在DropDown的selectedWorkflowStatus参数中。

所有这些都表示处理这种情况的正确方法是(在ASP.NET MVC中)使用视图模型:

public class MyViewModel
{
    public Guid SelectedCategoryGuid { get; set; }
    public WorkflowStatus WorkflowStatus { get; set; }
    public string EntityName { get; set; }
    public WorkflowStatus SelectedWorkflowStatus { get; set; }
}

您的控制器操作将采取:

[HttpPost]
public ActionResult FilterListingsWorkflow(MyViewModel model)
{
    // model.SelectedWorkflowStatus will contain the value from the DropDown
    // model.WorkflowStatus will contain the initial value
    ...
}

另请更换:

m => Model.SelectedWorkflowStatus

使用:

m => m.SelectedWorkflowStatus
DropDown中的

。您不需要在闭包中捕获模型。