web-dev-qa-db-fra.com

Obtient la valeur sélectionnée d'une DropDownList. Asp.NET MVC

J'essaie de renseigner une liste DropDownList et d'obtenir la valeur sélectionnée lorsque je soumets le formulaire: 

Voici mon modèle: 

public class Book
{
    public Book()
    {
        this.Clients = new List<Client>();
    }

    public int Id { get; set; }
    public string JId { get; set; }
    public string Name { get; set; }
    public string CompanyId { get; set; }
    public virtual Company Company { get; set; }
    public virtual ICollection<Client> Clients { get; set; }
}

Mes contrôleurs: 

    [Authorize]
    public ActionResult Action()
    {
        var books = GetBooks();
        ViewBag.Books = new SelectList(books);
        return View();
    }

    [Authorize]
    [HttpPost]
    public ActionResult Action(Book book)
    {
        if (ValidateFields()
        {
            var data = GetDatasAboutBookSelected(book);
            ViewBag.Data = data;
            return View();
        }
        return View();
    }

Ma forme: 

@using (Html.BeginForm("Journaux","Company"))
{
<table>
    <tr>
        <td>
            @Html.DropDownList("book", (SelectList)ViewBag.Books)
        </td>
    </tr>
    <tr>
        <td>
            <input type="submit" value="Search">
        </td>
    </tr>
</table>
}

Lorsque je clique sur l'icône, le paramètre 'livre' de l'action est toujours null . Qu'est-ce que je fais de travers?

9

En HTML, une liste déroulante n’envoie que de simples valeurs scalaires. Dans votre cas, ce serait l'id du livre sélectionné:

@Html.DropDownList("selectedBookId", (SelectList)ViewBag.Books)

puis adaptez l'action de votre contrôleur afin de récupérer le livre à partir de l'ID qui est transmis à l'action de votre contrôleur:

[Authorize]
[HttpPost]
public ActionResult Action(string selectedBookId)
{
    if (ValidateFields()
    {
        Book book = FetchYourBookFromTheId(selectedBookId);
        var data = GetDatasAboutBookSelected(book);
        ViewBag.Data = data;
        return View();
    }
    return View();
}
17
Darin Dimitrov

Vous pouvez utiliser DropDownListFor comme ci-dessous, il est si simple

@Html.DropDownListFor(m => m.Id, new SelectList(Model.Books,"Id","Name","1"))

(Vous avez besoin d'une vue fortement typée pour cela - Le sac View n'est pas adapté aux grandes listes)

   public ActionResult Action(Book model)
   {
        if (ValidateFields()
        {
            var Id = model.Id;
        ...        

Je pense que c'est plus simple à utiliser. 

1
mesut