Pergunta

Estou procurando o melhor método para criar um modelo de editor de lista suspensa com o MVC. Parece haver vários métodos, mas não consigo encontrar nenhum método que seja melhor, todo mundo parece fazer isso de maneira diferente. Também estou usando o MVC3 com o Razor, portanto, um método que funciona com isso é preferido.

Foi útil?

Solução

Existem muitas maneiras e dizer o que é o melhor seria subjetivo e pode não funcionar em seu cenário que, pela maneira como você esqueceu de descrever em sua pergunta. Veja como eu faço:

Modelo:

public class MyViewModel
{
    public string SelectedItem { get; set; }
    public IEnumerable<Item> Items { get; set; }
}

public class Item
{
    public string Value { get; set; }
    public string Text { get; set; }
}

Controlador:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            // TODO: Fetch this from a repository
            Items = new[] 
            {
                new Item { Value = "1", Text = "item 1" },
                new Item { Value = "2", Text = "item 2" },
                new Item { Value = "3", Text = "item 3" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
        {
            // redisplay the view to fix validation errors
            return View(model);
        }

        // TODO: The model is valid here => 
        // perform some action using the model.SelectedItem 
        // and redirect to a success page informing the user
        // that everything went fine
        return RedirectToAction("Success");
    }
}

Visão (~/Views/Home/Index.cshtml):

@model MyApp.Models.MyViewModel

@{ Html.BeginForm(); }
    @Html.EditorForModel()
    <input type="submit" value="OK" />
@{ Html.EndForm(); }

Modelo de editor (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyApp.Models.MyViewModel

@Html.DropDownListFor(x => x.SelectedItem, 
    new SelectList(Model.Items, "Value", "Text"))

Outras dicas

Pessoalmente, acho que os itens da lista devem ser colocados nos dados de exibição, não no modelo de exibição, mas realmente depende se você estiver exibindo uma suspensão que nunca muda (usando dados de exibição) ou se precisará modificá -lo dinamicamente (usando uma visualização modelo).

No exemplo, você está postando o mesmo modelo de visualização na ação do índice. A ação do índice está interessada apenas no item selecionado, portanto, pode alterar o parâmetro da ação do INDEX Post para ser a String selectEdItem. Dessa forma, o fichário do modelo analisará os parâmetros do formulário e preencherá o parâmetro de índice para você.

Além disso, acho que seria melhor passar em uma lista de listitems selecionados para a visualização dessa maneira que você não precisaria de nenhuma conversão e não precisaria da classe de itens.

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