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()" })
    }

ご覧のとおり、コントローラーに送信される 3 つのオブジェクトがあります。

  • Model.SelectedCategoryGuidModel.SelectedWorkFlowStatusおよびEntityName

WorkFlowStatusは列挙型であり、何らかの理由で、DropDownList の列挙型のいずれかをクリックすると、常に最初のものになります。

DropDownList に挿入される 3 つの Enum 値があります。

  • ドラフト、公開、およびアーカイブ。

したがって、それらのいずれかをクリックするたびに、コントローラーの変数にカーソルを合わせると、パラメーター variable:workflowstatusが常に Draft (最初のもの) であることがわかります。

CORRECT列挙型が渡されない理由を知っている人はいますか?

本当に迷惑です...

4

1 に答える 1

2

DropDownList の名前は ですSelectedWorkflowStatus。したがって、コントローラー アクションがそのようなパラメーターを引数として受け取ることを確認してください。

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

これで正しい値が得られます。フォームにいくつかのルート値を設定していることがわかります。

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

workflowStatusただし、アクションでパラメーターを見ないでください。この男には、ビューが最初にレンダリングされたときにフォームにハードコーディングされた古い値が含まれます。新しい値は、selectedWorkflowStatusDropDown からのパラメーターに格納されます。

この状況を処理する適切な方法は、(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 に答える