2016-03-08 28 views
5

Sto creando un'applicazione Web ASP.NET MVC6 (ASP.net Core 1.0) e voglio un semplice modulo che contenga più checkbox per una singola proprietà, consentendo selezioni multiple. Diciamo per argomento voglio che l'utente controlli una o più checkbox da un elenco di colori (rosso, blu, verde, giallo ecc.).Sintassi ASP.Net MVC6 per più caselle di controllo

Ho tre domande relative a questo ...

1) Che tipo di dati dovrebbe essere la proprietà colori nel mio modello vista (string, string[], bool[], List<String>, qualcos'altro)? è SelectList ancora una cosa valida in MVC6?

3) Qual è la sintassi corretta nella mia vista per rappresentare un elenco di checkbox nel modulo? Dovrei utilizzare la nuova funzionalità Tag helpers qui?

4) Quali dovrebbero essere i parametri di input per l'azione del mio controller? In asp.net 4.x sarebbe FormCollection ma non è sicuro che sia ancora valido?

risposta

1

ho appena implementato qualcosa di molto simile:

Casella Modello

public class CheckboxModel 
{ 
    public int Value { get; set; } 
    public string Text { get; set; } 
    public bool Checked { get; set; } 
} 

ViewModel

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     // populate checkbox collection with defaults here (or in your controller) 
    } 
    [AtLeastOneRequired(ErrorMessage = "Please check at least one checkbox.")] 
    public class List<CheckboxModel> Checkboxes { get; set; } 
} 

View

@for (var i = 0; i < Model.Checkboxes.Count; i++) 
{ 
    <div class="checkbox-inline"> 
     <input type="checkbox" asp-for="@Model.Checkboxes[i].Checked"/> 
     <input type="hidden" asp-for="@Model.Checkboxes[i].Text" /> 
     <input type="hidden" asp-for="@Model.Checkboxes[i].Value" /> 
     <label asp-for="@Model.Checkboxes[i].Checked">@Model.Checkboxes[i].Text</label> 
    </div> 
} 

Mi piacerebbe sapere se c'è un modo per eseguire la parte di visualizzazione di questo in MVC6, ma non l'ho ancora trovato.

personalizzato Attributo di convalida

public class AtLeastOneRequiredAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     var vm = (MyViewModel) context.ObjectInstance; 
     if (vm.Checkboxes.Any(v => v.Checked)) 
     { 
      return ValidationResult.Success; 
     } 

     return new ValidationResult(ErrorMessage); 
    } 
} 

L'Action Controllerè semplicemente:

public async Task<IActionResult> MyControllerAction(MyViewModel vm) 

So che questa è una vecchia questione, ma si spera che questa risposta aiuta a qualcun altro.