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?
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();
}
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.