2016-04-26 20 views
6

Przepraszam, ale większość moich wyszukiwań przenosi mnie do starych kodów MVC. Każda pomoc zostanie doceniona.W MVC 6, jak kodować listę checkbox w widoku i przekazywać sprawdzone wartości do kontrolera?

W MVC 6 z pomocników Tag, jak można zakodować zbiór wyboru:

  • Używaj znacznika pomocnika na etykiecie tak kliknięcie będzie przełączać sprawdzana wartość
  • Save (Bind?) Sprawdzonej wartości do nieruchomości IsOptionSelected
  • Przełóż tych sprawdzonych wartości z powrotem do kontrolera po kliknięciu Prześlij

?

Udało mi się poprawnie wyświetlić pola wyboru z etykietami, ale nie wiem, jak przekazać sprawdzone wartości z powrotem do kontrolera za pośrednictwem modelu. W tej chwili wartości IsOptionSelected wracają jako fałszywe.

Udało mi się również zrobić pomocnika html dla pracy z etykietą, ale nie dla pomocnika tagu. Mogę również kodować te wszystkie złe, więc wszelkie wskazówki pomogą!

Oto co mam do tej pory:

Wyświetlacz:

Phone Options Checkboxes

Podmiot:

public class PhoneOption 
{ 
    public bool IsOptionSelected { get; set; } = false; 
    public int OptionId { get; set; } 
    public string OptionName { get; set; } 
} 

Model:

[Display(Name = "Phone Options")] 
public IEnumerable<PhoneOption> PhoneOptions { get; set; } 

. . . . 
PhoneOptions = repository.GetPhoneOptions(); 

Repozytorium:

public IEnumerable<PhoneOption> GetPhoneOptions() 
{ 
    IEnumerable<PhoneOption> options = new[] 
    { 
     new PhoneOption { OptionId = 1, OptionName = "Phone Case",  IsOptionSelected = false }, 
     new PhoneOption { OptionId = 2, OptionName = "Screen Protector", IsOptionSelected = false }, 
     new PhoneOption { OptionId = 3, OptionName = "Car Charger",  IsOptionSelected = false }, 
     new PhoneOption { OptionId = 4, OptionName = "Extra Cable",  IsOptionSelected = false } 
    }; 
    return options; 
} 

Widok:

<div class="form-group"> 
    <label class="control-label">Phone Options</label> 
    <div> 
     @foreach (var option in Model.PhoneOptions) 
     { 
      <div> 
       @{ string cbId = "PhoneOption_" + @option.OptionId; } 
       <input [email protected] type="checkbox" [email protected] [email protected] [email protected] /> 
       @Html.Label(@cbId.ToString(), @option.OptionName) 
       @*This is causing invalid operation exception*@ 
       @*<label [email protected]()>@option.OptionName</label>*@ 
       <span [email protected] class="text-danger" role="alert"></span> 
      </div> 
     } 
    </div>  
</div> 

Z góry dzięki!

+0

Przypuszczam, że asp-for jest używany w niewłaściwy sposób. Zmień dane wejściowe na [email protected] na asp-for = "IsOptionSelected", które upewnią się, że jest ono powiązane z właściwością właściwą w PhoneOption. To samo w etykiecie [email protected]() jest błędne. Sprawdź tutorial tutaj dla pomocników tagów .http: //www.davepaquette.com/archive/2015/05/18/mvc6-select-tag -helper.aspx –

+0

Dzięki za sugestię, ale zmiana na asp-for = "IsOptionSelected" powoduje błąd składni, ponieważ nie znajduje się w głównym modelu. Jest częścią opcji Model.PhoneOption opcji iteracji foreach. asp-for = option.IsOptionSelected również nie będzie działać. I tak, już wcześniej czytałem samouczek, ale nie obejmował on listy wyboru, jak to, co próbuję zrobić. –

+1

Ahh Mam to. Sprawdź, czy to pomaga http://stackoverflow.com/questions/15375800/model-binding-to-a-list-mvc-4 –

Odpowiedz

6

To jest wreszcie to, co zrobiłem, aby go do pracy. Nie jestem pewien, czy to najlepszy sposób na zrobienie tego. Musiałem nadal korzystać z helperów, ponieważ pomocnicy tagów nie działają.

Model:

public List<PhoneOption> PhoneOptions { get; set; } 
. . . 
PhoneOptions = repository.GetPhoneOptions().ToList(); 

Zobacz:

@if (@Model.PhoneOptions != null && @Model.PhoneOptions.Count() > 0) 
{ 
    for (int i = 0; i < @Model.PhoneOptions.Count(); i++) 
    { 
     <div> 
      <input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" /> 
      <label asp-for="@Model.PhoneOptions[i].IsOptionSelected">@Model.PhoneOptions[i].OptionName</label> 

      @*If these are not included, all OptionIds become 0 and all OptionName becomes null*@ 
      @Html.HiddenFor(x => @Model.PhoneOptions[i].OptionId) 
      @Html.HiddenFor(y => @Model.PhoneOptions[i].OptionName) 
     </div> 
    }  
} 

Mam nadzieję, że to pomoże kogoś, kto jest o te same problemy lista wyboru.

AKTUALIZACJA: Zaktualizowałem pomocników html do tagowania pomocników powyżej.

+1

Cieszę się, że to zadziałało. Dziękujemy za przesłanie rozwiązania. –

+1

Używanie pomocników tagów powinno działać bez zarzutu - '' o ile używasz pętli 'for', a kolekcja to' IList '(nie' IEnumerable ' –

+0

Dzięki, @StephenMuecke! Próbowałem go i działało z małą zmianą -' '. Nadal nie mogę uczynić znacznika pomocniczego dla etykiety, aby "dołączyć" do pola wyboru. Oba to: 1) ' 'i 2)' 'nie można kliknąć, aby przełączyć wartość pola wyboru. Jeśli wiesz, jak to będzie świetne! –

0

ten sposób składnia powinna być w odniesieniu do każdego asp-for powinny być opakowane w ciągu znaków w cudzysłowie

@foreach (var option in Model.PhoneOptions) 
     { 
      <div> 
       @{ string cbId = "PhoneOption_" + @option.OptionId; } 
       <input asp-for="@option.IsOptionSelected" type="checkbox" value="@option.IsOptionSelected" id="@cbId" name="@cbId" /> 
       @Html.Label(@cbId.ToString(), @option.OptionName) 
       @*This is causing invalid operation exception*@ 
       @*<label asp-for="@cbId">@option.OptionName</label>*@ 
       <span asp-validation-for="@cbId" class="text-danger" role="alert"></span> 
      </div> 
     } 
+1

Przepraszam, próbowałem tego, ale wartości IsOptionSelected nadal są wysyłane jako false w kontroler, nawet jeśli pola wyboru są zaznaczone. –