2011-01-18 3 views
35
//in controller 
ViewBag.Categories = categoryRepository.GetAllCategories().ToList(); 

//in view 
@Html.DropDownList("Cat", new SelectList(ViewBag.Categories,"ID", "CategoryName")) 

Come posso fare in modo che di default si dice "-Selezionare Categoria-"convalidare una DropDownList in asp.net mvc

e convalidare controllare qualcosa è selezionato (client e sul modello)

Grazie

risposta

86

io proprio non riesco a credere che ci sono persone che ancora utilizzano Viewdata/ViewBag in ASP.NET MVC 3, invece di avere una vista fortemente tipizzati e visualizzare i modelli:

public class MyViewModel 
{ 
    [Required] 
    public string CategoryId { get; set; } 

    public IEnumerable<Category> Categories { get; set; } 
} 

e nel controllore:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Categories = Repository.GetCategories() 
     } 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // there was a validation error => 
      // rebind categories and redisplay view 
      model.Categories = Repository.GetCategories(); 
      return View(model); 
     } 
     // At this stage the model is OK => do something with the selected category 
     return RedirectToAction("Success"); 
    } 
} 

e quindi nella vista fortemente tipizzato:

@Html.DropDownListFor(
    x => x.CategoryId, 
    new SelectList(Model.Categories, "ID", "CategoryName"), 
    "-- Please select a category --" 
) 
@Html.ValidationMessageFor(x => x.CategoryId) 

Inoltre, se si desidera che la validazione lato client non dimenticate di fare riferimento gli script necessari:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
+1

Posso conoscere il motivo del supporto di Strongly type invece di ' ViewData/ViewBag' soprattutto nel contesto di Dropdownlist? – wwcdwdcw

+4

@wwcdwdcw, perché sono fortemente tipizzati garantendo la sicurezza in fase di compilazione e sono compatibili con il refactoring. –

+2

@ Html.DropDownListFor (x => x.CategoryId, nuova lista di selezione (Model.Categories, "ID", "CategoryName") .. - questo non è fortemente digitato. – Misi

8

C'è un sovraccarico con 3 argomenti. Html.DropdownList(name, selectList, optionLabel) Aggiornamento: c'era un errore di battitura nello snippet di codice seguente.

@Html.DropDownList("Cat", new SelectList(ViewBag.Categories,"ID", "CategoryName"), "-Select Category-") 

Per l'uso validatore

@Html.ValidationMessage("Cat") 
+0

"-Selezionare Categoria- "non viene ancora visualizzato .. – raklos

+3

C'era un tipo nel frammento di codice. Dovrebbe essere '@ Html.DropDownList (" Cat ", nuova SelectList (ViewBag.Categories," ID "," CategoryName ")," -Seleziona categoria - ")' – marcind

0

Esempio da MVC 4 per la convalida dropdownlist su Invia utilizzando Dataannotation e ViewBag (meno riga di codice)

Modelli:

namespace Project.Models 
{ 
    public class EmployeeReferral : Person 
    { 

     public int EmployeeReferralId { get; set; } 


     //Company District 
     //List     
     [Required(ErrorMessage = "Required.")] 
     [Display(Name = "Employee District:")] 
     public int? DistrictId { get; set; } 

    public virtual District District { get; set; }  
} 


namespace Project.Models 
{ 
    public class District 
    { 
     public int? DistrictId { get; set; } 

     [Display(Name = "Employee District:")] 
     public string DistrictName { get; set; } 
    } 
} 

EmployeeReferral Controller:

namespace Project.Controllers 
{ 
    public class EmployeeReferralController : Controller 
    { 
     private ProjDbContext db = new ProjDbContext(); 

     // 
     // GET: /EmployeeReferral/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

public ActionResult Create() 
     { 
      ViewBag.Districts = db.Districts;    
      return View(); 
     } 

Vista:

<td> 
        <div class="editor-label"> 
         @Html.LabelFor(model => model.DistrictId, "District") 
        </div> 
       </td> 
       <td> 
        <div class="editor-field"> 
         @*@Html.DropDownList("DistrictId", "----Select ---")*@ 
         @Html.DropDownListFor(model => model.DistrictId, new SelectList(ViewBag.Districts, "DistrictId", "DistrictName"), "--- Select ---") 
         @Html.ValidationMessageFor(model => model.DistrictId)             
        </div> 
       </td> 

Perché non possiamo usare ViewBag per popolare DropDownList che possono essere convalidati con annotazioni. Sono meno linee di codice.

1

Per ListBox/discesa nella MVC5 - ho trovato questo a lavorare per me sofar:

nel Modello:

[Required(ErrorMessage = "- Select item -")] 
public List<string> SelectedItem { get; set; } 
public List<SelectListItem> AvailableItemsList { get; set; } 

in Vista:

@Html.ListBoxFor(model => model.SelectedItem, Model.AvailableItemsList) 
@Html.ValidationMessageFor(model => model.SelectedItem, "", new { @class = "text-danger" }) 
+0

Perché il tuo oggetto selezionato è una lista? Ma sono d'accordo con il tuo esempio, l'annotazione "Richiesto" è la chiave per ottenere la convalida. – BrianLegg

+0

potrebbe essere che questo era per il multiselect .... – womd