Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC对类属性使用验证_Asp.net_Asp.net Mvc_Validation_Data Annotations - Fatal编程技术网

ASP.NET MVC对类属性使用验证

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

我的ASP.NET MVC应用程序中有一个简单的模型,我希望对一个类属性进行验证。我看了ScottGu关于类级验证的博客,但是验证发生在对上下文调用
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; }