8

ビューモデルとチェックボックスに関するさまざまな投稿を読んでいますが、脳がロックし始めており、正しい方向に少し押す必要があります。

これが私の簡略化されたビューモデルです。リストに値を入力する必要があるチェックボックスがあります。これが自動的に起こるとは思わない。文字列値の配列とリストの間のギャップを正しく埋める方法がわかりません。提案?

public int AlertId { get; set; }

public List<int> UserChannelIds { get; set; }

public List<int> SharedChannelIds { get; set; }

public List<int> SelectedDays { get; set; }
4

4 に答える 4

7

チェックボックスアイテムを表すために、このようなビューモデルを用意します

public class ChannelViewModel 
{
  public string Name { set;get;}
  public int Id { set;get;}
  public bool IsSelected { set;get;}
}

これで、メインのViewModelは次のようになります

public class AlertViewModel
{
  public int AlertId { get; set; }
  public List<ChannelViewModel> UserChannelIds { get; set; }      
  //Other Properties also her

  public AlertViewModel()
  {
    UserChannelIds=new List<ChannelViewModel>();       
  }

}

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

public ActionResult AddAlert()
{
    var vm = new ChannelViewModel();

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

    return View(vm);
}

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

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

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

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

@model AlertViewModel
<h2>AddTag</h2>
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => m.AlertId)
        @Html.TextBoxFor(m => m.AlertId)
    </div>    
    <div>  
      @Html.EditorFor(m=>m.UserChannelIds)         
    </div>    
    <input type="submit" value="Submit" />
}

これで、フォームを投稿すると、モデルにUserChannelIdsコレクションが作成され、選択したチェックボックスにプロパティのTrue値が設定されIsSelectedます。

[HttpPost]
public ActionResult AddAlert(AlertViewModel model)
{
   if(ModelState.IsValid)
   {
      //Check for model.UserChannelIds collection and Each items
      //  IsSelected property value.
      //Save and Redirect(PRG pattern)
   }
   return View(model);
}
于 2012-08-31T19:36:51.477 に答える
2

私のビューモデルの一部:

public List<int> UserChannelIds { get; set; }

public List<int> SharedChannelIds { get; set; }

public List<int> Weekdays { get; set; }

public MyViewModel()
{
    UserChannelIds = new List<int>();
    SharedChannelIds = new List<int>();
    Weekdays = new List<int>();
}

部分ビューを使用して、再利用可能なチェックボックスを表示しました (この時点ではエディター テンプレートについて知りませんでした)。

@using AlertsProcessor
@using WngAlertingPortal.Code
@model List<int>
@{
    var sChannels = new List<uv_SharedChannels>();
    Utility.LoadSharedChannels(sChannels);
}

<p><strong>Shared Channels:</strong></p>
<ul class="channel-list">
@{
    foreach (var c in sChannels)
    {
        string chk = (Model.Contains(c.SharedChannelId)) ? "checked=\"checked\"" : "";

        <li><input type="checkbox" name="SharedChannelIds" value="@c.SharedChannelId" @chk /> @c.Description (@c.Channel)</li>
    }
}

3 つのチェックボックスの部分ビューはすべて互いに類似しています。チェックボックスの値は整数であるため、ビューモデルのリスト名をチェックボックス名と並べることで、バインディングが機能します。

私は int 値で作業しているので、チェックボックスを表すために追加のクラスが必要だとは思いません。チェックされたチェックボックスのみが送信されるため、チェックされていることを確認する必要はありません。送信された値が欲しいだけです。コンストラクターで List を初期化することにより、null 例外を回避する必要があります。

これは、他のソリューションよりも優れていますか、それとも劣っていますか、それとも同じくらい優れていますか? 他のソリューション (追加のクラスを含む) はベスト プラクティスですか?

次の記事が役に立ちました。

http://forums.asp.net/t/1779915.aspx/1?Checkbox+in+MVC3

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

于 2012-09-04T16:14:12.917 に答える
0
 public class MembershipViewData
 {
   public MembershipViewData()
   {
      GroupedRoles = new List<GroupedRoles>();
      RolesToPurchase = new List<uint>();
   }

   public IList<GroupedRoles> GroupedRoles { get; set; }
   public IList<uint> RolesToPurchase { get; set; }
 }
 
//view
 
 @model VCNRS.Web.MVC.Models.MembershipViewData
 @{
    ViewBag.Title = "MembershipViewData";
    Layout = "~/Views/Shared/_Layout.cshtml";
    int i = 0;
  }
  
@using (Html.BeginForm("Membership", "Account", FormMethod.Post, new { id = "membershipForm" }))
{
   <div class="dyndata" style="clear: left;">
      <table width="100%" cellpadding="0" cellspacing="0" class="table-view list-view">

        foreach (var kvp2 in Model.GroupedRoles)
        {
          string checkBoxId = "RolesToPurchase" + kvp2.RoleType;
          <tr>
            <td width="240px">
              <label class="checkbox-label" for="@checkBoxId">
                 <input type="checkbox" class="checkbox" name="RolesToPurchase[@i]" 
                   id="@checkBoxId" value="@kvp2.RoleType" />
                   @kvp2.Key
              </label>
            </td>
          </tr>
          
          i++;
}
                                 
   <tr style="background-color: #ededed; height: 15px;">
      <td colspan="5" style="text-align: right; vertical-align: bottom;">                                  
         @Html.SubmitButton(Resources.MyStrings.Views_Account_Next)
      </td>
   </tr>
 </table>
</div>
}

//Post Action

[HttpPost]
public ActionResult Membership(MembershipViewData viewData)
{
 ..........................
}
} 
于 2020-06-25T11:29:08.467 に答える