繁体   English   中英

使用C#asp.net MVC代码优先方法在Razor中验证@ Html.DropDownList和@ Html.DropDownListFor

[英]Validation for @Html.DropDownList and @Html.DropDownListFor in Razor using C# asp.net mvc code first approach

我是MVC的新手,以前的经验是asp.net Web表单,现在我很难使用C#asp.net mvc代码优先方法在Razor中为@ Html.DropDownList和@ Html.DropDownListFor添加验证。

下面是我的设计:

   <div class="form-group">
        @Html.LabelFor(model => model.State, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("States", new SelectList(ViewBag.States as System.Collections.IEnumerable, "StateId", "StateName", new { @class = "control-label col-md-2" }), "Select a State", new { id = "dd_State" })

        </div>
    </div>

      <div class="form-group">
        @Html.LabelFor(model => model.City, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(Model => Model.City, new SelectList(Enumerable.Empty<SelectListItem>(), "CityName", "CityName"),"Select a City", new { id = "dd_City" })
            <span id="span1" name="span1"></span>
          </div>
      </div>

以下是我的模型代码Register.cs,无法添加StateCity的 require字段

  [Table("Register")]
public class Register
{
    [Key]
    public int Sno { get; set; }
    [Required(ErrorMessage = "Name is required.")]
    [Display(Name = "Full name")]
    public string Fullname { get; set; }
    [Display(Name = "Email Id")]
    [Required(ErrorMessage = "Email is required.")]
    public string EmailId { get; set; }
    [Required(ErrorMessage = "Password is required.")]
    public string Password { get; set; }
    [Required(ErrorMessage = "Mobile is required.")]
    public string Mobile { get; set; }
    [Required(ErrorMessage = "Address is required.")]
    public string Address { get; set; }
    public string State { get; set; }
    public string City { get; set; }
    [Required(ErrorMessage = "Entity is required.")]
    public string EntityType { get; set; }
    public string Website { get; set; }
    public string PinCode { get; set; }
    public string accountactivated { get; set; }

}

我也无法将Bootstrap CSS添加到@ Html.DropDownList和@ Html.DropDownListFor,请检查下拉菜单外观。

在此处输入图片说明

我的州和城市模型班。

在此处输入图片说明

在此处输入图片说明

您的问题是您不应将EF域模型用作视图模型。 您应该创建特定于视图需求的视图模型。 然后,您可以将State和City指定为必填项,而不必在数据库中进行设置。

您的域模型应该很简单:

[Table("Register")]
public class Register
{
    [Key]
    public int Sno { get; set; }
    [Required(ErrorMessage = "Name is required.")]
    [Display(Name = "Full name")]
    public string Fullname { get; set; }
    [Display(Name = "Email Id")]
    [Required(ErrorMessage = "Email is required.")]
    public string EmailId { get; set; }
    [Required(ErrorMessage = "Password is required.")]
    public string Password { get; set; }
    [Required(ErrorMessage = "Mobile is required.")]
    public string Mobile { get; set; }
    [Required(ErrorMessage = "Address is required.")]
    public string Address { get; set; }
    public string State { get; set; }
    public string City { get; set; }
    [Required]
    public string EntityType { get; set; }
    public string Website { get; set; }
    public string PinCode { get; set; }
    public string accountactivated { get; set; }
}

然后,您的视图模型可以如下所示:

public class RegisterViewModel
{
    public int Sno { get; set; }
    [Required(ErrorMessage = "Name is required.")]
    [Display(Name = "Full name")]
    public string Fullname { get; set; }
    [Display(Name = "Email Id")]
    [Required(ErrorMessage = "Email is required.")]
    public string EmailId { get; set; }
    [Required(ErrorMessage = "Password is required.")]
    public string Password { get; set; }
    [Required(ErrorMessage = "Mobile is required.")]
    public string Mobile { get; set; }
    [Required(ErrorMessage = "Address is required.")]
    public string Address { get; set; }
    [Required(ErrorMessage = "State is required.")]
    public string State { get; set; }
    [Required(ErrorMessage = "City is required.")] 
    public string City { get; set; }
    [Required(ErrorMessage = "Entity is required.")]
    public string EntityType { get; set; }
    public string Website { get; set; }
    public string PinCode { get; set; }
    public string accountactivated { get; set; }
 }

现在,在表格上输入城市和州是必需的,但在数据库中则不需要。 除非您将其添加到上下文中,否则将不会为此类创建迁移。

现在,您只需加载视图即可使用HttpGet Action时所需的值,然后将要保存的内容移回实体中进行保存。

如果恶意用户得知您正在使用域模型作为视图模型,他们可以通过将元素添加到浏览器中的表单中而使用与您不认为要公开的属性相同的名称,从而将数据戳入属性。 另一个原因是,您必须确保将模型中的每个值都返回给控制器,或者在发回时将值从模型中清除。 您只能通过将这些值放入带有名称的输入中来执行此操作。 这将为恶意用户提供他们所需要找出的所有更改。

更好的做法是使用特定于数据表示的单独视图模型。 然后将数据从视图模型映射到域模型,反之亦然。

试试下面的代码。 通过在DropDownListFor方法内添加新的{@class =“ form-control”},这应该可以解决样式问题。

关于验证,您只需要在City / States上添加所需的属性,这应该呈现没有“ Select City / State”占位符的下拉列表。

     <div class="form-group">
        @Html.LabelFor(model => model.City, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(m => m.City, Utility.GetCityList(), new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" })
        </div>
    </div>

对于我可能多次使用的国家/城市等下拉菜单,我将它们放在Models文件夹内的Utility类中,并在我的视图顶部引用我的Utility,如下所示:

    @using SampleApp.Models

在Utility类中,我将有一个类似于下面的方法,该方法将SelectList返回到下拉列表。

    public static IEnumerable<SelectListItem> GetCityList()
    {
        IList<SelectListItem> list = new List<SelectListItem>
        {
            new SelectListItem() {Text="New York", Value="New York"},
            new SelectListItem() {Text="London", Value="London"}
        };

        return list;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM