2012-05-18 8 views
11

Mam widoku MVCJak mapować pola wyboru na członków modelu MVC?

<%@ Page Language="C#" MasterPageFile="PathToMaster" Inherits="System.Web.Mvc.ViewPage<ModelData>" %> 

i mam formularz z znaczników HTML dla zestawu wyboru:

<label for="MyCheckbox">Your choice</label> 
<input type="checkbox" id="Option1" class="checkbox" name="MyCheckbox" value="Option one" /> 
<label for="Option1">Option one</label><br /> 
<input type="checkbox" id="Option2" class="checkbox" name="MyCheckbox" value="Option two" /> 
<label for="Option2">Option two</label><br /> 

i mam parę kontroler działania

class MyController : Controller { 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult RequestStuff(ModelData data) 
    { 
    } 
} 

i że działanie jest wywoływane po przesłaniu formularza.

Jak mogę zmapować wyboru na członków ModelData (a co członkowie muszę dodać do ModelData) tak, że gdy formularz jest składany informacji data przechowuje na których pola wyboru są sprawdzane?

Odpowiedz

9

OK, ten będzie dla MVC3, ale - zapisać dla zmian składni - powinien działać również w MVC2. Podejście jest zasadniczo takie samo.

Przede wszystkim należy przygotować odpowiedni model (Widok)

public class MyViewModel 
{ 
    [DisplayName("Option 1")] 
    public bool Option1 { get; set; } 

    [DisplayName("Option 2")] 
    public bool Option2 { get; set; } 
} 

Następnie przechodzą ten model do widoku jesteś pokazując (Controller):

public ActionResult EditMyForm() 
{ 
    var viewModel = new MyViewModel() 
    return View(viewModel); 
} 

z formularza :

@model MyViewModel 
@using(Html.BeginForm()) 
{ 
    @Html.Label("Your choice") 

    @Html.LabelFor(model => model.Option1) // here the 'LabelFor' will show you the name you set with DisplayName attribute 
    @Html.CheckBoxFor(model => model.Option1) 

    @Html.LabelFor(model => model.Option2) 
    @Html.CheckBoxFor(model => model.Option2) 
    <p> 
     <input type="submit" value="Submit"/> 
    </p> 
} 

Teraz tutaj pomocnicy HTML (cały CheckBoxFor, LabelFor, EditorFor itd.) Umożliwiają powiązanie danych z właściwościami modelu.

Pamiętaj, że EditorFor, gdy właściwość jest typu bool, również wyświetli pole wyboru w widoku. :)

A potem, po przesłaniu do regulatora, to będzie automatycznie powiązać wartości:

[HttpPost] 
public ActionResult EditMyForm(MyViewModel viewModel) 
{ 
    //And here the view model's items will be set to true/false, depending what you checked. 
} 
+0

Tworzenie wzmianek o wyróżnikachDobrze to dobry punkt.EditorFor jest przydatny prawie zawsze. W zależności od typu danych tworzy tekst, tekst, pole wyboru i tak dalej. – ozgur

3

Najpierw trzeba określić SelectList dla Opcji. Będzie on używany tylko do renderowania wyboru

public IList<SelectListItem> OptionsSelectList { get; set; } 

niż można zdefiniować model, który będzie trzymać wartość pojedynczej wybranej opcji po postu

public class ChooseOptionViewModel 
{ 
    public int OptionIdentifier { get; set; } //name or id 
    public bool HasBeenChosen { get; set; } //this is mapped to checkbox 
} 

Then IList z tych opcji w ModelData

public IList<ChooseOptionViewModel> Options { get; set; } 

Na koniec widok

@for (int i = 0; i < Model.OptionsSelectList.Count(); i++) 
    { 
     <tr> 
      <td class="hidden"> 
       @Html.Hidden("Options[" + i + "].OptionIdentifier", Model.OptionsSelectList[i].Value) 
      </td> 
      <td> 
       @Model.OptionsSelectList[i].Text 
      </td> 
      <td> 
       @Html.CheckBox("Options[" + i + "].HasBeenChosen", Model.Options != null && Model.Options.Any(x => x.OptionIdentifier.ToString().Equals(Model.OptionsSelectList[i].Value) && x.HasBeenChosen)) 
      </td> 
     </tr> 
    } 

Po poście, wystarczy sprawdzić Options.Where(x => x.HasBeenChosen)

Jest to pełny funkcjonalny, a to pozwala na ponowne wyświetlenie widoku, gdy wystąpią błędy walidacji itd To wydaje się nieco skomplikowany, ale nie mają pochodzić z dowolnego lepsze rozwiązanie niż to.