【问题标题】:Dropdownlist client side required validation (without model)下拉列表客户端需要验证(无模型)
【发布时间】:2018-09-11 02:25:06
【问题描述】:

查看

@Html.DropDownList("CategoryItems", null, new { @class = "ddlcs" })
@Html.ValidationMessage("CategoryItems")

控制器

var cat = from s in db.CategoryDbSet
          where s.IsActive == true
          orderby s.CatName
          select new { s.CatID, s.CatName };

var catListItems = cat.ToList()
                      .Select(c => new SelectListItem   
                             {
                                 Text = c.CatName,
                                 Value = c.CatID.ToString()
                             })
                       .ToList();

catListItems.Insert(0, new SelectListItem 
                           {
                               Text = "[--Select the category--]", 
                               Value = "" 
                           });

ViewBag.CategoryItems = catListItems;

当有人在保存操作期间选择“选择类别”选项时,我希望在下拉列表中强制执行所需的验证。我是 MVC 框架的新手,我不确定我在哪里犯了错误?此下拉菜单与模型无关。

请提出解决方案。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    此下拉菜单与模型无关。

    这是错误的。 ASP.NET MVC 中的验证通过使用相应的属性装饰视图模型属性来工作。例如,如果你想让这个下拉菜单成为必需,你可以用[Required] 属性装饰视图模型上的相应属性。

    因此,将必要的属性添加到您现有的视图模型中:

    public class MyViewModel
    {
        [Required]
        public int? SelectedCategoryId { get; set; }
    
        public IEnumerable<SelectListItem> Categories { get; set; }
    
        ... some other properties that your view might need
    }
    

    然后在您的控制器操作中填充此视图模型:

    var model = new MyViewModel();
    model.Categories = cat
        .ToList()
        .Select(c => new SelectListItem   
        {
            Text = c.CatName,
            Value = c.CatID.ToString()
        }).ToList();
    
    return View(model);
    

    在您看来,请使用强类型版本的助手:

    @Html.DropDownListFor(
        x => x.SelectedCategoryId,
        Model.Categories, 
        "[--Select the category--]", 
        new { @class = "ddlcs" }
    )
    @Html.ValidationMessageFor(x => x.SelectedCategoryId)
    

    【讨论】:

    • 感谢您的帮助。但我正在使用 EF 将 db 对象映射到模型中。无论我在哪里使用此模型,我都会在其他地方收到错误消息。 System.Data.SqlClient.SqlException:列名“SelectedCategoryId”无效。
    • 现在我该如何为其他地方修复这个新属性。
    • 您不应该在视图中使用您的 EF 模型。这就是视图模型的用途。您的控制器可以在 2 之间映射。
    • 在列表页面上,我正在做类似这样的事情 public ActionResult Index() { ViewBag.Message = "List of Advertisements";返回视图(db.ADVERTISEMENT.ToList()); }
    • 您能否建议我如何在控制器中进行映射?
    【解决方案2】:

    如果您只想要客户端验证,您可以这样做:

    $('form').validate({
        rules:{
            CategoryItems: 'required'
        }
    });
    

    Working demo.

    但我不建议这样做,因为客户端验证是为了更好的用户体验,并且可以轻松绕过。 Darin 的回答中描述了使用数据注释和视图模型的正确方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多