2011-06-19 17 views
3

私は、チェックボックスの選択に基づいてオブジェクトを渡すことが可能かどうか疑問に思っていました。自分自身を説明する:選択された値がある場合、それは実際には、選択を表すオブジェクトを渡す必要があることを意味します。チェックボックスに基づいてビューからオブジェクトを渡す方法は?

私は、私の見解では、このコードを持っている:

<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %> 
    <%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br /> 
<% } %> 

あなたが見ることができるように、私は、コントローラに渡すオブジェクト・タイプのリスト(一覧)

は、誰かが持っていますかを持っています助言がありますか?

おかげ

答えて

1

は、私は非常に強く、ビューモデル、強く型付けされたビューとエディタのテンプレートを使用して、あなたをお勧めします。

だから、いつものようにあなたのビューが必要になる場合があります必要なすべてのデータが含まれていますビューモデルを定義することによって開始します。その後、

public class CanalViewModel 
{ 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

コントローラ:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new CanalViewModel { Name = "canal 1", Selected = false }, 
      new CanalViewModel { Name = "canal 2", Selected = true }, 
      new CanalViewModel { Name = "canal 3", Selected = false }, 
      new CanalViewModel { Name = "canal 4", Selected = false }, 
     }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(IEnumerable<CanalViewModel> model) 
    { 
     return View(model); 
    } 
} 

をし、次の~/Views/Home/Index.aspxビューが来ます:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.CanalViewModel>>" 
%> 

<% using (Html.BeginForm()) { %> 
    <%= Html.EditorForModel() %> 
    <input type="submit" value="OK" /> 
<% } %> 

最後に、運河用のエディタテンプレートが必要ですどのモデル(~/Views/Home/EditorTemplates/CanalViewModel.ascx)の各要素に対して実行されます:あなたがフォームを送信する際

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.CanalViewModel>" 
%> 

<div> 
    <%= Html.HiddenFor(x => x.Name) %> 
    <%= Html.CheckBoxFor(x => x.Selected) %> 
    <%= Html.LabelFor(x => x.Selected, Model.Name) %> 
</div> 

さて、POSTアクション内で、あなたは自分の選択したプロパティは、どのチェックボックスに応じているとともに、すべての運河のリストを取得しますユーザーが選択します。

ご覧のとおり、ViewDataには醜いキャストを実行する必要があり、ビューにはforeachループを書く必要はありません。すべては、よく確立された規則に従い、フレームワークによって自動的に処理されます。

0

javascriptを使用すると、すべてのチェックボックスのチェック値(カンマ区切り)を非表示フィールドで収集し、コントローラからこの値を読み取り、分割することができます。あなたは

public ActionResult MyAction(FormCollection form) 
    { 
    String[] AllValues = form["AllValues"].Split(","); 
    } 
をコントローラに

<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %> 
<%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br /> 
<% } %> 
<%=Html.HiddenField("AllValues")%> 

javascriptの

var allvalues=''; 
    $('input[type=checkbox]').each(function(index){ 
     if($(this).is(':checked')) 
     { 
      allvalues+=$(this).val(); 
     } 
    }); 
    $('#AllValues').val(allvalues); 

(私はjqueryのを使用しています)

関連する問題