我有一个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.SelectedWorkFlowStatus
和EntityName
。 WorkFlowStatus
是一个枚举,出于某种原因,每当我点击DropDownList中的任何枚举时,它总是成为第一个。
我有三个Enum值插入到DropDownList中:
所以,每当我点击其中任何一个时,当我将鼠标悬停在Controller中的变量上时,我看到参数变量:workflowstatus
始终是Draft(这是第一个)。
有谁知道为什么没有传递CORRECT枚举?
这真让我烦恼......
答案 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中的。您不需要在闭包中捕获模型。