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

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

¿Cómo puedo hacer para que por defecto se dice "-Seleccionar Categoria-"validar una lista desplegable en asp.net mvc

y validar comprobar algo se selecciona (cliente y el modelo)

Gracias

Respuesta

86

Simplemente no puedo creer que haya gente que todavía utilizan ViewData/ViewBag en ASP.NET MVC 3 en lugar de tener puntos de vista inflexible de tipos y modelos de vista:

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

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

y en su controlador:

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

y luego en su opinión inflexible:

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

Además, si quieres validación del lado del cliente no se olvide de hacer referencia a los scripts necesarios:

<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

¿Puedo saber la razón detrás de apoyar Strongly type en lugar de ' ViewData/ViewBag' especialmente en el contexto Dropdownlist? – wwcdwdcw

+4

@wwcdwdcw, porque están fuertemente tipados, lo que garantiza la seguridad en tiempo de compilación y son refactorios. –

+2

@ Html.DropDownListFor (x => x.CategoryId, nueva SelectList (Model.Categories, "ID", "CategoryName") .. - esto no está fuertemente tipado. – Misi

8

Hay una sobrecarga con 3 argumentos. Html.DropdownList(name, selectList, optionLabel) Actualización: hubo un error tipográfico en el siguiente fragmento de código.

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

Para el uso validador

@Html.ValidationMessage("Cat") 
+0

"-Seleccionar Categoria- "todavía no aparece ... – raklos

+3

Había un tipo en el fragmento de código. Debería ser '@ Html.DropDownList (" Cat ", nueva SelectList (ViewBag.Categories," ID "," CategoryName ")," -Seleccionar categoría - ")' – marcind

0

Ejemplo de MVC 4 para la validación de lista desplegable en Enviar utilizando Dataannotation y ViewBag (menos línea de código)

Modelos:

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 controlador:

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> 

Por qué no podemos usar ViewBag para poblar dropdownlists que pueden validarse con anotaciones. Son menos líneas de código.

1

Para ListBox/desplegable de MVC5 - He encontrado que esto funcione para mí sofar:

en el Modelo:

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

en Vista:

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

¿Por qué su SelectedItem es una lista? Pero estoy de acuerdo con su ejemplo, la anotación "Requerido" es la clave para que la validación suceda. – BrianLegg

+0

podría ser que esto fuera para multiselect .... – womd

Cuestiones relacionadas