ASP.NET MVC对类属性使用验证
我的ASP.NET MVC应用程序中有一个简单的模型,我希望对一个类属性进行验证。我看了ScottGu关于类级验证的博客,但是验证发生在对上下文调用ASP.NET MVC对类属性使用验证,asp.net,asp.net-mvc,validation,data-annotations,Asp.net,Asp.net Mvc,Validation,Data Annotations,我的ASP.NET MVC应用程序中有一个简单的模型,我希望对一个类属性进行验证。我看了ScottGu关于类级验证的博客,但是验证发生在对上下文调用SaveChanges()时,这是我不想要的。我希望它的反应就像您在提交表单时通过DataAnnotations得到的验证一样 这是我的模型: public class SignupModel { [Display(Name = "Company Name")] [Required(ErrorMessage = "Company Na
SaveChanges()
时,这是我不想要的。我希望它的反应就像您在提交表单时通过DataAnnotations
得到的验证一样
这是我的模型:
public class SignupModel
{
[Display(Name = "Company Name")]
[Required(ErrorMessage = "Company Name Required")]
public string CompanyName { get; set; }
[Display(Name = "Company Type")]
[Required(ErrorMessage = "Company Type Required")]
public int SelectedCompanyTypeId { get; set; }
[Display(Name = "Requested Services")]
[Required(ErrorMessage = "At least 1 service is required")]
public PostedServicesOffered PostedServices { get; set; }
public IEnumerable<ServicesOffered> ServicesOffered { get; set; }
public IEnumerable<ServicesOffered> SelectedServicesOffered { get; set; }
public IEnumerable<SelectListItem> CompanyTypes { get; set; }
}
这是控制器:
public ActionResult Index()
{
SignupModel model = new SignupModel()
{
CompanyTypes = SelectCompanyType(),
ServicesOffered = GetServicesOffered(),
SelectedServicesOffered = new List<ServicesOffered>(),
PostedServices = new PostedServicesOffered()
};
ViewBag.BannerText = "Sign Up Form";
return View(model);
}
[HttpPost]
public ActionResult Index(SignupModel model)
{
if (ModelState.IsValid)
{
}
return View(GetSignupModel(model));
}
private SignupModel GetSignupModel(SignupModel model)
{
SignupModel signupModel = new SignupModel();
var selectedServices = new List<ServicesOffered>();
var postedServicesOfferedIds = new string[0];
if (model.PostedServices == null)
model.PostedServices = new PostedServicesOffered();
// if a view model array of posted services ids exists
// and is not empty,save selected ids
if (model.PostedServices.ServiceOfferedIds != null && model.PostedServices.ServiceOfferedIds.Any())
postedServicesOfferedIds = model.PostedServices.ServiceOfferedIds;
//If there are any selected ids saved, create a list of ServicesOffered.
if (postedServicesOfferedIds.Any())
selectedServices = GetServicesOffered()
.Where(x => postedServicesOfferedIds.Any(s => x.ServicesOfferedId.ToString().Equals(s)))
.OrderBy(x => x.ServiceName)
.ToList();
signupModel.CompanyTypes = SelectCompanyType();
signupModel.ServicesOffered = GetServicesOffered();
signupModel.SelectedServicesOffered = selectedServices;
signupModel.PostedServices = model.PostedServices;
signupModel.SelectedCompanyTypeId = model.SelectedCompanyTypeId;
return signupModel;
}
private IEnumerable<ServicesOffered> GetServicesOffered()
{
return Repository.GetServicesOffered(new UnitOfWork()).OrderBy(so => so.ServiceName);
}
private IEnumerable<SelectListItem> SelectCompanyType()
{
List<SelectListItem> items = new List<SelectListItem>();
var companyTypes = Repository.GetCompanyTypes(new UnitOfWork()).OrderBy(ct => ct.CompanyType1);
foreach (CompanyType companyType in companyTypes)
items.Add(new SelectListItem()
{
Text = companyType.CompanyType1,
Value = companyType.CompanyTypeId.ToString()
});
return items;
}
public ActionResult Index()
{
SignupModel模型=新的SignupModel()
{
CompanyType=选择CompanyType(),
ServicesOffered=GetServicesOffered(),
SelectedServicesOffered=新列表(),
PostedServices=新的PostedServicesOffered()
};
ViewBag.BannerText=“注册表格”;
返回视图(模型);
}
[HttpPost]
公共行动结果索引(注册模型)
{
if(ModelState.IsValid)
{
}
返回视图(GetSignupModel(model));
}
私有注册模型GetSignupModel(注册模型模型)
{
SignupModel SignupModel=新的SignupModel();
var selectedServices=新列表();
var postedServicesOfferedIds=新字符串[0];
if(model.PostedServices==null)
model.PostedServices=新的PostedServicesOffered();
//如果存在已发布服务ID的视图模型数组
//并且不为空,请保存所选ID
if(model.PostedServices.ServiceOfferedIds!=null&&model.PostedServices.ServiceOfferedIds.Any())
postedServicesOfferedIds=model.PostedServices.ServiceOfferedIds;
//如果保存了任何选定的ID,请创建所提供服务的列表。
if(postedServicesOfferedIds.Any())
selectedServices=GetServicesOffered()
.Where(x=>postedServicesOfferedIds.Any(s=>x.ServicesOfferedId.ToString().Equals(s)))
.OrderBy(x=>x.ServiceName)
.ToList();
signupModel.CompanyTypes=SelectCompanyType();
signupModel.ServicesOffered=GetServicesOffered();
signupModel.SelectedServicesOffered=selectedServices;
signupModel.PostedServices=model.PostedServices;
signupModel.SelectedCompanyTypeId=model.SelectedCompanyTypeId;
返回注册模型;
}
private IEnumerable GetServicesOffered()
{
返回Repository.GetServicesOffered(newunitofwork()).OrderBy(so=>so.ServiceName);
}
私有IEnumerable SelectCompanyType()
{
列表项=新列表();
var companyTypes=Repository.GetCompanyTypes(newunitofwork()).OrderBy(ct=>ct.CompanyType1);
foreach(公司类型中的公司类型)
items.Add(新建SelectListItem()
{
Text=companyType.CompanyType1,
Value=companyType.CompanyTypeId.ToString()
});
退货项目;
}
以及以下观点:
<div id="contact-form" class="contatct-form">
<h4 class="classic-title"><span>Registration</span></h4>
@using (Html.BeginForm())
{
<div class="validation-text">
<h5>@Html.ValidationSummary()</h5>
</div>
<div class="row padBtm-20">
<div class="col-md-4">
@Html.LabelFor(x => x.CompanyName)
@Html.TextBoxFor(x => x.CompanyName, new { placeholder = "Company Name..." })
</div>
<div class="col-md-4">
@Html.LabelFor(x => x.SelectedCompanyTypeId)
@Html.DropDownListFor(x => x.SelectedCompanyTypeId, Model.CompanyTypes)
@Html.HiddenFor(x => x.SelectedCompanyTypeId, new { value = Model.SelectedCompanyTypeId })
</div>
<div class="col-md-4">
@Html.LabelFor(model => model.PostedServices)<br />
@*@Html.CheckBoxListFor(model => model.PostedServices.ServiceOfferedIds,
model => model.ServicesOffered,
service => service.ServicesOfferedId,
service => service.ServiceName,
model => model.SelectedServicesOffered,
Position.Vertical)*@
@Html.CheckBoxListFor(model => model.PostedServices,
model => model.ServicesOffered,
service => service.ServicesOfferedId,
service => service.ServiceName,
model => model.SelectedServicesOffered,
Position.Vertical)
</div>
</div>
<div class="row padBtm-20"></div>
<input type="submit" class="button" value="Send Message" />
}
</div>
登记处
@使用(Html.BeginForm())
{
@Html.ValidationSummary()
@LabelFor(x=>x.CompanyName)
@TextBoxFor(x=>x.CompanyName,新的{placeholder=“Company Name…”)
@LabelFor(x=>x.SelectedCompanyTypeId)
@Html.DropDownListFor(x=>x.SelectedCompanyTypeId,Model.CompanyTypes)
@Html.HiddenFor(x=>x.SelectedCompanyTypeId,new{value=Model.SelectedCompanyTypeId})
@Html.LabelFor(model=>model.PostedServices)
@*@Html.CheckBoxListFor(model=>model.PostedServices.ServiceOfferedIds,
model=>model.servicesfored,
服务=>service.servicesOfferDid,
service=>service.ServiceName,
model=>model.SelectedServicesOffered,
位置(垂直)*@
@Html.CheckBoxListFor(model=>model.PostedServices,
model=>model.servicesfored,
服务=>service.servicesOfferDid,
service=>service.ServiceName,
model=>model.SelectedServicesOffered,
位置(垂直)
}
简而言之,ServicesOffered
属性是显示为复选框的服务列表。我正在使用一个名为MvcCheckBoxList
(已找到)的NeGut包,它基于列表创建一组复选框
当我选中“否”复选框后单击“提交”,表单将首先验证其他属性,并首先显示这些错误消息。只有在这些字段通过验证并发布表单后,
PostedServices
字段才未通过验证打开并显示错误。如何使其验证而不像所有其他属性一样过帐?问题是您正在将字符串数组封装到另一个类中。让我详细分析验证时发生的情况,以便您理解为什么这不起作用
首先,验证同时发生在客户端和服务器端。您似乎遇到的问题是,除此属性之外的所有内容都是在客户端进行验证的。然后,一旦表单实际发布,此特定属性在服务器端失败,并导致表单在该点重新显示。客户端验证通过添加数据-* 表单字段的属性。这些属性依次通知客户端val
<div id="contact-form" class="contatct-form">
<h4 class="classic-title"><span>Registration</span></h4>
@using (Html.BeginForm())
{
<div class="validation-text">
<h5>@Html.ValidationSummary()</h5>
</div>
<div class="row padBtm-20">
<div class="col-md-4">
@Html.LabelFor(x => x.CompanyName)
@Html.TextBoxFor(x => x.CompanyName, new { placeholder = "Company Name..." })
</div>
<div class="col-md-4">
@Html.LabelFor(x => x.SelectedCompanyTypeId)
@Html.DropDownListFor(x => x.SelectedCompanyTypeId, Model.CompanyTypes)
@Html.HiddenFor(x => x.SelectedCompanyTypeId, new { value = Model.SelectedCompanyTypeId })
</div>
<div class="col-md-4">
@Html.LabelFor(model => model.PostedServices)<br />
@*@Html.CheckBoxListFor(model => model.PostedServices.ServiceOfferedIds,
model => model.ServicesOffered,
service => service.ServicesOfferedId,
service => service.ServiceName,
model => model.SelectedServicesOffered,
Position.Vertical)*@
@Html.CheckBoxListFor(model => model.PostedServices,
model => model.ServicesOffered,
service => service.ServicesOfferedId,
service => service.ServiceName,
model => model.SelectedServicesOffered,
Position.Vertical)
</div>
</div>
<div class="row padBtm-20"></div>
<input type="submit" class="button" value="Send Message" />
}
</div>
[Display(Name = "Requested Services")]
[Required(ErrorMessage = "At least 1 service is required")]
public string[] PostedServices { get; set; }