0

リストとフィルター オプションを含むビューがあります。リストで選択したアイテムを一度に更新するオプションを追加する必要があります。リストとフィルター オプションを表示すると、次のようになります。

    @model GWeb.Models.FilterModel
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
   <fieldset>
        <legend>Search criteria</legend>
            @Html.LabelFor(model => model.ProjectId, "Project")       
            @Html.DropDownList("ProjectId",
            new SelectList(ViewBag.projectListDesciption as System.Collections.IEnumerable, "Id", "Desciption"), "all")

            @Html.LabelFor(model => model.StartWork, "From Date")       
            @(Html.Telerik().DatePicker()
            .Name("StartWork")
            .Value(Model.StartWork))  

        <input type="submit" value="Filter" name="submitButton"/>
    </fieldset>  
    <fieldset>
        <legend>Status change</legend>        
            Change status on selected:        
            @Html.DropDownList("Status",
             new SelectList(ViewBag.statusList as System.Collections.IEnumerable, "Id", "Description"))

        <input type="submit" value="Update" name="submitButton"/>
    </fieldset>
}

@{Html.RenderPartial("WorkList", Model.workList);}

リストが部分ビューでレンダリングされる場所は、次のようになります。

@model IEnumerable<GWeb.Models.WorkModel>   
    @foreach (var item in Model)
    {
        <tr>
            <td>
            @Html.CheckBox("chb" + item.Id, item.Selected)
            </td>
            ...
        </tr>
    }

使用されているモデルは次のとおりです。

        public class FilterModel
    { 
        public int ProjectId { get; set; }         
        public DateTime? StartWork { get; set; }  
        public int? Status { get; set; }

        public List<WorkModel> workList { get; set; }
    }

    public class WorkModel
    {
        public int Id { get; set; }
        ...         
        public bool Selected { get; set; }
    }

コントローラーでは、どのボタンがクリックされたかを確認しています。「更新」だった場合は、変更を行いたいです。しかし、workFilter.workListは常に null です。

public ActionResult WorkManager(FilterModel workFilter, string submitButton)
    {            
        if (submitButton == "Update")
        {
            if (workFilter.workList != null)
            {
                //...
            }             
        }
        else
        {
           //filter
        }
        //...           
        return View(workFilter);

更新するチェックボックスが選択されているコントローラーをチェックインするにはどうすればよいですか?

どんな助けでも大歓迎です!

4

2 に答える 2

1

MVC HTML エディター テンプレートを使用して非順次プレフィックス コレクション インデックスを生成する方法を確認する必要があります。もう少し複雑なものについては、そのようなことをする必要があるからです。

問題の迅速な解決策は次のとおりです。

//instead of: @{Html.RenderPartial("WorkList", Model.workList);} write code below inside using statement(below </fieldset>)


    @for (int i = 0; i < Model.worklist.Count; i++)
    {
        <tr>
            <td>
            @Html.HiddenFor(x => x.workList[i].Id)
            @Html.CheckBoxFor(x => x.workList[i].Selected)
            </td>
            ...
        </tr>
    }

警告: 上記のコードはテストされていませんが、上の回答を参照することをお勧めします。

于 2012-09-11T14:25:30.303 に答える
0

workList is NULL の問題を回避するには、コードを FilterModel デフォルト コンストラクター (パラメーターなしのコンストラクター) に追加して、ダミー項目で workList を作成および初期化します。

これで問題が解決するかどうかお知らせください。

アップデート:

コンストラクターにコードを追加することの効果を明確にしておらず申し訳ありません。いいえ、新しいモデルは作成されません。これが行うことは、workList を初期化して、Controller がその中のインデックス付き要素にアクセスできるようにすることです。

サンプルコード:

public FilterModel(){
  workList = new List<WorkModel>();
  for(int i = 0; i < MAX_WORKMODEL_COUNT; i++){
    workList.Add(new WorkModel());
  }
}
于 2012-09-11T14:39:59.413 に答える