0

我有一个 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.SelectedCategoryGuid,Model.SelectedWorkFlowStatusEntityName.

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

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

  • 草稿、发布和存档。

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

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

真是烦死我了……

4

1 回答 1

2

您的 DropDownList 的名称是SelectedWorkflowStatus. 因此,请确保您的控制器操作将此类参数作为参数:

[HttpPost]
public ActionResult FilterListingsWorkflow(WorkflowStatus selectedWorkflowStatus)
{
    ...
}

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

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

但不要workflowStatus在您的操作中查看参数。这家伙将包含旧值,即第一次呈现视图时在表单中硬编码的值。新值存储在来自 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

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

于 2013-01-25T14:47:59.107 回答