2013-04-08 20 views
9

Asp.NET MVC:Bir DropDownList öğesinin seçili değerini alın. Bir DropDownList doldurmak için ve ben formu gönderdiğinde seçilen değeri almaya çalışıyorum

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; } 
} 

Benim Kontrolörler:

[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(); 
    } 
İşte

benim modelidir

Benim Form:

@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> 
} 

zaman, pa tıklayın Eylemdeki rameter 'book' her zaman boştur. Neyi yanlış yapıyorum?

cevap

17

HTML'de bir açılır kutu yalnızca basit skaler değerler gönderir. Senin durumunda seçili kitabın kimliği olacaktır:

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

ve size denetleyicisi eylemine geçti alır id kitabı alır, böylece daha sonra denetleyicisi eylemi adapte:

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

Çalışıyor! Çok teşekkürler :) –

+0

Bunun hakkında başka bir sorum var. Aslında, DropDownList seçilen değeri 'Book'un' ToString() 'yönteminin değerini döndürür. Bu yüzden Ids'yi DropDownList'ime yerleştirmeliyim, ancak listenin başlığı ve seçili değeri Kimlik olarak göstermesini istiyorum. Bunu yapmanın bir yolu var mı? Şimdilik, bu yolla kullanıyorum: 'ToString()' yöntemi "Id - Title" değerini döndürür ve ben sadece Id değerini korumak için 'SubString()' kullanırım. Ancak DropDownList'in yalnızca Kimliksiz Başlığı göstermesini istiyorum. –

+0

DropDown'a ilettiğiniz 'SelectList' sınıfı 'IEnumerable ', 'SelectListItem' 2 özelliği vardır:' Value' ve 'Text'. İstediğiniz biçime, "Değeri", Kitap örneğinizin ve "Metin" inizin "Kimlik" ine ayarlayabilirsiniz. –

1

Sen olarak aşağıda DropDownListFor kullanabilirsiniz O kadar basit

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

(Bunun için kesinlikle yazılı görünümü gerek - Görünüm torba geniş listeler için uygun değildir)

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

Bunun daha kolay olduğunu düşünüyorum.

İlgili konular