【问题标题】:ASP.NET MVC - Enum not being sent to ControllerASP.NET MVC - 枚举未发送到控制器
【发布时间】:2013-01-25 14:31:00
【问题描述】:

我有一个如下所示的 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 中的任何枚举时,它总是会成为第一个。

我有三个枚举值被插入到 DropDownList 中,它们是:

  • 草稿、发布和存档。

因此,每当我单击其中任何一个并将鼠标悬停在控制器中的变量上时,我都会看到参数变量:workflowstatus 始终是 Draft(这是第一个)。

有人知道为什么没有传递正确的枚举吗?

真的很烦我……

【问题讨论】:

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


    【解决方案1】:

    您的 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
    

    在您的下拉菜单中。您不需要在闭包中捕获模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-05
      • 2017-07-04
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多