2013-01-25 33 views
0

我有一個DropDropListFor,看起來像這樣:ASP.NET MVC - 枚舉不被髮送到控制器

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總是草案(這是第一個)。

有誰知道爲什麼正確的枚舉不被傳遞過來?

這真是煩我......

回答

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 

在你的DropDown中。您不需要在閉包中捕獲模型。

+0

完美運作。謝謝。 – Subby