2013-08-05 32 views
7

私は望ましい結果を得るために成功したものの、私は私のアプローチに疑問を持って、MVCのチェックボックスのリストを実装しています:Asp.Net MVCのチェックボックスリスト

public class AdditionalServicesModel 
{ 
    public IList<SelectListItem> AdditionalServices { get; set; } 
} 

======= ========================================== ================

public class HomeController : Controller 
{ 
    // 
    // GET: /Home/ 

    public ActionResult Index() 
    { 
     AdditionalServicesModel objAdditionalServicesModel = new AdditionalServicesModel(); 

     List<SelectListItem> services = new List<SelectListItem>(); 
     services.Add(new SelectListItem { Text = "service-1", Value = "1", Selected=false }); 
     services.Add(new SelectListItem { Text = "service-2", Value = "2", Selected=false }); 
     services.Add(new SelectListItem { Text = "service-3", Value = "3", Selected=false }); 
     objAdditionalServicesModel.AdditionalServices = services; 

     return View(objAdditionalServicesModel); 
    } 

    [HttpPost] 
    public ActionResult Index(AdditionalServicesModel result) 
    { 
     return RedirectToAction("Thanks", "Home"); 
    } 

    public ActionResult Thanks() 
    { 
     return View(); 
    } 
} 

=========================== ===========================

@model checkboxes.Models.AdditionalServicesModel 
@{ 
    ViewBag.Title = "Index"; 
    Layout = null; 
} 


@using (Html.BeginForm("Index", "Home", FormMethod.Post)) 
{ 
    for (int i = 0; i < Model.AdditionalServices.Count; i++) 
    {   
     <ul> 
      <li> 
       @Html.CheckBoxFor(m=>Model.AdditionalServices[i].Selected, new { id = "Chk-" + i}) 
       @Html.Label(Model.AdditionalServices[i].Text, new { @for = "Chk-" + i }) 
       @Html.HiddenFor(m => Model.AdditionalServices[i].Text) 
       @Html.HiddenFor(m=> Model.AdditionalServices[i].Value) 
      </li> 
     </ul> 
    } 
    <input type="submit" value="POST to Controller" /> 
} 

1)1つのチェックボックスに2つの追加の隠しフィールドを作成する必要があります。 良いアプローチがありますか?私はチェックボックスの値+名前を送信するだけで、この長い道のりをすべてするのは間違っているように感じます.JSA経由で値を収集して送信する方がはるかに簡単ですが、妥当性は確認されません。

2)選択したボックスのみを送信する必要がある間は、すべてのチェックボックスを送信します。 フォームの投稿でそれを行う方法はありますか?

+0

検証を使用することができます。選択したオプションをサーバーに送り返す前に、フォームオブジェクトでvalidateを呼び出すだけで済みます。 – ps2goat

+0

あなたはクライアントとサーバーの両方で機能する控えめな検証を意味しましたか?あなたは私のための例がありますか? – Alex

+0

返信するプロパティのみを持つ2番目のモデルを作成しない限り、部分的なデータのみを返信する場合、同じ検証を使用することはできません。あなたはモデルを同期させておく必要があるので、そうするのは少し毛深いでしょう。 1つのモデルを使用して、すべてのデータをポストすることは、そのリンクのパート2であるモデルでDataAnnotationsを使用して、両方の場所で検証できます。 DataAnnotationsは控えめなjavascriptで使用され、Datastate.IsValid()関数があり、データがどこにポストされるのかを呼び出します。 – ps2goat

答えて

4

カスタム 'サービスチェックボックスアイテム'クラス(再利用可能)を作成し、AdditionalServicesModelのプロパティとしてそれらのリストまたは列挙可能なものを作成します。 また、コントローラのモデルプロパティを割り当てる必要がないように、モデルのコンストラクタを作成することをお勧めします。

public class ServicesItem 
{ 
    public bool Selected { get; set; } 
    public string Value { get; set; } 
    public string Text { get; set; } 
} 

public class AdditionalServicesModel 
{ 
    public AdditionalServicesModel(IList<ServicesItem> items){ 
     this.AdditionalServices = items; 
    } 

    public IList<ServicesItem> AdditionalServices { get; set; } 
} 

のみ値と選択したプロパティがデフォルトに戻ってバインドされるように、あなたがテキストの隠しを追加する必要はありません(簡単にあなたのビューで参照するために、追加サービスのカスタムエディタのテンプレートを作成しますモデル:次に

@Html.CheckBoxFor(m => Selected) 
    @Html.LabelFor(m => Text) 
    @Html.HiddenFor(m => Value) 

(MVC.netはその魔法をやらせる - それが何を参照するには、マークアップを見て)あなたのビューにエディタのテンプレートをポップ:

@Html.EditorFor(m => m.AdditionalServices) 

その後AUTOMを検査

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      List<SelectListItem> services = new List<SelectListItem>(); 
      services.Add(new SelectListItem { Text = "service-1", Value = "1", Selected=false }); 
      services.Add(new SelectListItem { Text = "service-2", Value = "2", Selected=false }); 
      services.Add(new SelectListItem { Text = "service-3", Value = "3", Selected=false }); 

      return View(new AdditionalServicesModel(services)); 
     } 

    [HttpPost] 
    public ActionResult Index(AdditionalServicesModel result) 
    { 
     var selectedServicesList = result.AdditionalServices.Where(s => s.Selected); 
     return RedirectToAction("Thanks", "Home"); 
    } 
} 
関連する問題