Pergunta

Eu tenho uma visão forte tipo de tipo

List<List<MyViewModelClass>>

A lista externa sempre terá duas listas de List<MyViewModelClass>. Para cada uma das duas listas exteriores eu quero mostrar um grupo de caixas de seleção. Cada conjunto pode ter um número arbitrário de escolhas.

Minha classe vista do modelo é semelhante à seguinte:

public class MyViewModelClass
{
    public Area Area { get; set; }

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

Assim, a visão final será algo parecido com:


Por favor seleccione aqueles que se aplicam:

Primeiro conjunto de opções:

  • x Opção 1
  • x Opção 2
  • x Opção 3
  • etc.

Segundo conjunto de opções:

  • x Segunda Opção 1
  • x Segunda Opção 2
  • x Segunda Opção 3
  • x Segunda Opção 4
  • etc.

As caixas de verificação deve exibir MyViewModelClass.Area.Name, e seu valor deve estar relacionado com MyViewModelClass.Area.Id. estado verificado é, naturalmente, relacionado com MyViewModel.IsChecked.

Pergunta

Gostaria de saber como eu deveria usar Html.CheckBox() ou ajudante Html.CheckBoxFor() para exibir minhas caixas? Eu tenho que obter esses valores de volta para o servidor em uma nova postagem é claro.

Eu gostaria de ter a minha ação do controlador como um deles:

public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
    // process data
}

public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
    // process data
}

Se isso torna as coisas mais simples, eu poderia fazer um separado tipo vista do modelo como:

public class Options
{
    public List<MyViewModelClass> First { get; set; }

    public List<MyViewModelClass> Second { get; set; }
}

Além de mudar a minha primeira versão de ação do controlador para:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}

Foi útil?

Solução 2

Solução

Acontece que isso não é tão complicado em tudo. Tudo que você tem a fazer é nomear seus controles de forma adequada e tudo vai ser unidos como deveria ser. Então. O que quer que seus controles, eles devem sempre ser nomeado como:

name="first[0].propName"
name="first[1].propName"
name="first[2].propName"
name="first[3].propName"
...

// or
name="first[0].data[0].property"
name="first[0].data[1].property"
name="first[0].data[2].property"
...
name="first[1].data[0].property"
name="first[1].data[1].property"
...

Todos estes irão se obrigado a parâmetro List<SomeType> first ação do controlador (a segunda tem outra coleção dentro de uma coleção).

Nota muito importante
Se você adicionar / remover esses controles dinamicamente usando Javascript, você tem que ter certeza, que os índices são partida consecutiva de 0, e não ter quaisquer lacunas. E você terá um aplicativo de trabalho agradável com número dinâmico de elementos em uma coleção.

Você pode ler sobre isso em meu blog também.

Outras dicas

Geralmente eu criar um tipo (modelo) que "modelos" da opinião de que eu quero criar. i.

public class FooViewModel
{
    public List<Option> General { get; set; }
    public List<Option> Others { get; set; }

    //Some Methods and other properties
}
public FooController :...
{
    private FooViewModel fooViewModel = new FooViewModel();
}

Edit: Ter um olhar para este post , como é exatamente o que você quer!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top