使用C#asp.net mvc代码优先方法验证Razor中的@Html.DropDownList和@Html.DropD



我对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的必填字段

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

此外,我无法将引导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操作时工作所需的值,并将您想要保存的内容移回实体中进行保存。

如果恶意用户得知你使用域模型作为视图模型,他们可以通过在浏览器中向表单中添加与你认为没有暴露的属性同名的元素,将数据插入属性。另一个原因是,您必须确保模型中的每个值都返回到控制器,否则在返回时将从模型中清除值。您只能通过将这些值放入带有名称的输入中来实现这一点。这将为恶意用户提供所需的一切,让他们知道该更改什么。

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

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

关于验证,您只需要在城市/州上添加所需的属性,这样就可以在没有"选择城市/州"占位符的情况下呈现下拉列表。

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

最新更新