2

私は自分のプロジェクトの 1 つとして asp net MVC 3 を使用しています。コーディングには部分ビューを使用しています。リストにすべての顧客をリストし、その情報をリストとして送信したいと考えています。ポストバックでリストを送信しようとすると、リストが null であることが送信されます。以下のように私のコードを見つけることができます:

私のコントローラーメソッドは次のとおりです。

[HttpPost]
    public ActionResult ConfirmUsers(ICollection<Career.DomainModel.UserApprovalDto> collection)
    {
        string bas = "";
        //if (collection != null)

        if (ModelState.IsValid)
        {
            bas = "bas";
        }

        return RedirectToAction("Index");
    }

私の部分的な見解は次のとおりです。

@model List<Career.DomainModel.UserApprovalDto>
@using (Html.BeginForm("ConfirmUsers", "ManageUsers", new { area = "" }, FormMethod.Post))
{
    <table>
        <tr>
            <th>
                Name
            </th>
            <th>
                Is Reported
            </th>
        </tr>
        @for (int i = 0; i < Model.Count(); i++)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => Model[i].FirstName)
                </td>
                <td>
                    @Html.CheckBox("IsReported", Model[i].IsReported.HasValue ? Model[i].IsReported.Value : false)
                    @*@Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);*@ @*    @if (Model[i].IsReported != null)
                    {
                        @Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);
                    }
                    else
                    {
                        @Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);
                    }*@
                </td>
                <td>
                </td>
            </tr>
        }
    </table>
    <div>
        <input name="submitUsers" type="submit" value="Save" />
    </div>
}

前もって感謝します。

ケレム

4

5 に答える 5

1

これを処理するには、エディター テンプレートを使用します。View Model をこのようにして、CheckBox 項目を表します。

public class ReportedUserViewModel 
{
  public string FirstName { set;get;}
  public int Id { set;get;}
  public bool IsSelected { set;get;}
}

Youtメインビューモデルで、上記のクラスのコレクションであるプロパティを追加します

public class ConfirmUserViewModel
{      
  public List<ReportedUserViewModel> ReportedUsers{ get; set; }      
  //Other Properties also here

  public ConfirmUserViewModel()
  {
    ReportedUsers=new List<ReportedUserViewModel>();       
  }    
}

GETアクションで、ViewModel の値を入力し、それをビューに送信します。

public ActionResult ConfirmUser()
{
    var vm = new ConfirmUserViewModel();

    //The below code is hardcoded for demo. you mat replace with DB data.
    vm.ReportedUsers.Add(new ReportedUserViewModel { Name = "Test1" , Id=1});
    vm.ReportedUsers.Add(new ReportedUserViewModel { Name = "Test2", Id=2 });

    return View(vm);
}

それでは、EditorTemplate を作成しましょう。EditorTemplateViews/YourControllerNameというフォルダに移動して作成し、そこにプロパティ名と同じ名前の新しいビューを作成します( )ReportedUsers.cshtml

このコードを新しく作成したエディター テンプレートに追加します。

@model ReportedUserViewModel 
<p>
  <b>@Model.FirstName </b>   :
  @Html.CheckBoxFor(x => x.IsSelected) <br />
  @Html.HiddenFor(x=>x.Id)
</p>

EditorForメイン ビューで、 Html ヘルパー メソッドを使用してエディター テンプレートを呼び出します。

@model ConfirmUserViewModel
@using (Html.BeginForm())
{
    <div>  
      @Html.EditorFor(m=>m.ReportedUsers)         
    </div>    
    <input type="submit" value="Submit" />
}

フォームを投稿すると、モデルにはReportedUsers、選択したチェックボックスがプロパティの真の値を持つコレクションが作成されますIsSelected

[HttpPost]
public ActionResult AddAlert(ConfirmUserViewModel model)
{
   if(ModelState.IsValid)
   {
      //Check for model.ReportedUsers collection and Each items
      //  IsSelected property value.
      //Save and Redirect(PRG pattern)
   }
   return View(model);
}
于 2012-11-11T01:58:05.727 に答える
0

ちょっと出遅れましたが、モデルに埋め込めば一覧を参照するだけで十分簡単です--

@Html.CheckBoxFor(modelItem => Model.List[i].Selected)

これにより、イテレータ内の各アイテムがポストバックされます。

于 2013-11-08T21:29:52.037 に答える
0

先週同じ問題に遭遇しました。

データベースを設計したときにチェックボックスの値をnullにできるようにしたため、データベースから取得したときにチェックボックスに3つの値(true / false / null)があることに気付きました。私はdbを再設計し、問題は解決しました。

モデルを投稿しなかったので、これが事実かどうかはわかりません。モデルを見て、 Ischeck プロパティの上に Nullable を書いている場合は、データベースに移動して再設計してください。isCheck を思い出してください。isSelected プロパティには 2 つの値 (true/false) のみが必要です。

于 2016-04-03T17:26:47.910 に答える
0

あなたが書いたコードでは、MVC モデル バインダー メカニズムは、これらの入力をオブジェクトのリストにマップする方法を知りません。

代わりに、次の小さなトリックを実行してください。

@Html.CheckBox("[" + i + "]." + "IsReported", Model[i].IsReported.Value);

これにより、入力フィールドの名前は、リストの最初の項目が [0].IsReported、次の項目が [1].IsReported になります。

それはうまくいくはずです。

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

于 2012-11-11T16:49:55.737 に答える