Asp.net mvc 动态添加元素验证错误

Asp.net mvc 动态添加元素验证错误,asp.net-mvc,Asp.net Mvc,我在模型的属性上添加了一些只接受数字的正则表达式 public class MaterialsViewModel { [Display(Name = "Material")] public string MaterialName { get; set; } [Range(typeof(int), "0", "999")] [RegularExpression(@"^\d+$", ErrorMessage = "Pleas

我在模型的属性上添加了一些只接受数字的正则表达式

  public class MaterialsViewModel
    {
        [Display(Name = "Material")]
        public string MaterialName { get; set; }
        [Range(typeof(int), "0", "999")]
        [RegularExpression(@"^\d+$", ErrorMessage = "Please enter proper value")]
        public int? Quantity { get; set; }
        [RegularExpression(@"^\d+$", ErrorMessage = "Please enter proper value")]
        public double? Cost { get; set; }
        public IEnumerable<SelectListItem> CategoryList { get; set; }

        public int SelectedCategory { get; set; }
        public string SelectedCategoryName { get; set; }
    }
公共类材质视图模型
{
[显示(Name=“Material”)]
公共字符串MaterialName{get;set;}
[范围(整型),“0”,“999”)]
[正则表达式(@“^\d+$”,ErrorMessage=“请输入正确的值”)]
公共整数?数量{get;set;}
[正则表达式(@“^\d+$”,ErrorMessage=“请输入正确的值”)]
公共双成本{get;set;}
公共IEnumerable类别列表{get;set;}
public int SelectedCategory{get;set;}
公共字符串SelectedCategoryName{get;set;}
}
我有自己的视图,可以在其中动态添加控件

 Dynamically add ScopeOfWork and Materials<br />
    <div id="scopes">
        <h3>Scopes</h3>
        <a href="javascript:void(0)" id="addScope">Add Scope of Work</a>
        @for (int i = 0; i < Model.ScopeOfWork.Count; i++)
        {
            <div class="scope">
                <div class="form-group">
                    @Html.LabelFor(m => m.ScopeOfWork[i].ScopeOfWorkName, htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.ScopeOfWork[i].ScopeOfWorkName, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.ScopeOfWork[i].ScopeOfWorkName)
                    </div>
                </div>
                <input type="hidden" class="scopeindex" name="ScopeOfWork.Index" value="@i" />
                <div class="indent materials">
                    <h4>Material</h4>
                    <a href="javascript:void(0)" class="addmaterial">Add Material</a>
                    @for (int j = 0; j < Model.ScopeOfWork[i].Materials.Count; j++)
                    {
                        <div class="material">
                            <div class="form-group">
                                @Html.LabelFor(m => m.ScopeOfWork[i].Materials[j].MaterialName, htmlAttributes: new { @class = "control-label col-md-2" })
                                <div class="col-md-2">
                                    @Html.TextBoxFor(m => m.ScopeOfWork[i].Materials[j].MaterialName, new { @class = "form-control" })
                                </div>
                                <div class="col-md-10 col-md-offset-2">
                                    @Html.ValidationMessageFor(m => m.ScopeOfWork[i].Materials[j].MaterialName)
                                </div>
                            </div>
                            <div class="form-group">
                                @Html.LabelFor(m => m.ScopeOfWork[i].Materials[j].Quantity, htmlAttributes: new { @class = "control-label col-md-2" })
                                <div class="col-md-1">
                                    @Html.TextBoxFor(m => m.ScopeOfWork[i].Materials[j].Quantity, new { @class = "form-control" })
                                </div>
                                <div class="col-md-10 col-md-offset-2">
                                    @Html.ValidationMessageFor(m => m.ScopeOfWork[i].Materials[j].Quantity)
                                </div>
                            </div>
                            <div class="form-group">
                                @Html.LabelFor(m => m.ScopeOfWork[i].Materials[j].Cost, htmlAttributes: new { @class = "control-label col-md-2" })
                                <div class="col-md-1">
                                    @Html.TextBoxFor(m => m.ScopeOfWork[i].Materials[j].Cost, new { @class = "form-control" })
                                </div>
                                <div class="col-md-10 col-md-offset-2">
                                    @Html.ValidationMessageFor(m => m.ScopeOfWork[i].Materials[j].Cost)
                                </div>
                            </div>
                            <div class="form-group">
                                <label class="control-label col-md-2">Category</label>
                                <div class="col-xs-2">
                                    @Html.DropDownListFor(m => m.ScopeOfWork[i].Materials[j].SelectedCategory, Model.ScopeOfWork[i].Materials[j].CategoryList, "Please select", htmlAttributes: new { @class = "form-control" })
                                </div>
                            </div>
                            <input type="hidden" class="materialindex" name="ScopeOfWork[@i].Materials.Index" value="@j" />
                        </div>
                    }
                </div>
            </div>
        }
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-success" />
        </div>
    </div>
</div>
}


<div id="newScope" style="display:none">
    <div class="scope">
        <div class="form-group">
            <label for="_#__ScopeOfWorkName" class="control-label col-md-2">Scope Of Work</label>
            <div class="col-md-10">
                <input class="form-control" type="text" id="_#__ScopeOfWorkName" name="ScopeOfWork[#].ScopeOfWorkName" value="">
                <span class="field-validation-valid text-danger" data-valmsg-for="ScopeOfWork[#].ScopeOfWorkName" data-valmsg-replace="true"></span>
            </div>
        </div>
        <input type="hidden" class="scopeindex" name="ScopeOfWork.Index" value="#" />
        <div class="materials">
            <h4>Material</h4>
            <a href="javascript:void(0)" class="addmaterial">Add Material</a>
        </div>
        <hr />
    </div>
</div>

<div id="newMaterial" style="display:none">
    <div class="form-group">
        <label for="_#__Materials_%__MaterialName" class="control-label col-md-2">Material</label>
        <div class="col-md-2">
            <input class="form-control" type="text" id="_#__Materials_%__MaterialName" name="ScopeOfWork[#].Materials[%].MaterialName" value="">
            <span class="field-validation-valid text-danger" data-valmsg-for="ScopeOfWork[#].Materials[%].MaterialName" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label for="_#__Materials_%__Quantity" class="control-label col-md-2">Quantity</label>
        <div class="col-md-1">
            <input class="form-control" type="text" id="_#__Materials_%__Quantity" name="ScopeOfWork[#].Materials[%].Quantity" value="">
            <span class="field-validation-valid text-danger" data-valmsg-for="ScopeOfWork[#].Materials[%].Quantity" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label for="_#__Materials_%__Cost" class="control-label col-md-2">Cost</label>
        <div class="col-md-1">
            <input class="form-control" type="text" id="_#__Materials_%__Cost" name="ScopeOfWork[#].Materials[%].Cost" value="">
            <span class="field-validation-valid text-danger" data-valmsg-for="ScopeOfWork[#].Materials[%].Cost" data-valmsg-replace="true"></span>
        </div>
    </div>
    @*Drop down*@
    <div class="form-group">
        <label for="_#__Materials_%__SelectedCategory" class="control-label col-md-2">Category</label>
        <div class="col-xs-2">
            <select class="form-control category" id="_#__Materials_%__SelectedCategory" name="ScopeOfWork[#].Materials[%].SelectedCategory">
                <option value="">--Select--</option>
            </select>
        </div>
    </div>

    <input type="hidden" class="materialindex" name="ScopeOfWork[#].Materials.Index" value="%" />
</div>

<script>
    var form = $('form');
    var scope = $('#newScope');
    var material = $('#newMaterial');
    var categories = @Html.Raw(Json.Encode(Model.CategoryList));

    form.on('click', '.addmaterial', function () {
        var clone = material.clone();
        var scopeIndex = $(this).closest('.scope').find('.scopeindex').val();
        clone.html($(clone).html().replace(/#/g, scopeIndex));

        var materialIndex = new Date().getTime();
        clone.html($(clone).html().replace(/%/g, materialIndex));
        // drop down list
        var select = clone.find('.category');
        $.each(categories, function(index, item) {
            select.append($('<option></option>').val(item.Value).text(item.Text));
        });
        $(this).closest('.materials').append(clone.html());

        form.data('validator', null);
        $.validator.unobtrusive.parse(form);
    });

    $('#addScope').click(function () {
        var clone = scope.clone();
        var scopeIndex = new Date().getTime();
        clone.html($(clone).html().replace(/#/g, scopeIndex));
        $('#scopes').append(clone.html());
        form.data('validator', null);
        $.validator.unobtrusive.parse(form);
    });
</script>
动态添加工作范围和材料
范围 @for(int i=0;im.ScopeOfWork[i].ScopeOfWorkName,htmlAttributes:new{@class=“control label col-md-2”}) @Html.TextBoxFor(m=>m.ScopeOfWork[i].ScopeOfWorkName,新的{@class=“form control”}) @Html.ValidationMessageFor(m=>m.ScopeOfWork[i].ScopeOfWorkName) 布料 @对于(int j=0;jm.ScopeOfWork[i].Materials[j].MaterialName,htmlAttributes:new{@class=“control label col-md-2”}) @Html.TextBoxFor(m=>m.ScopeOfWork[i].Materials[j].MaterialName,new{@class=“form control”}) @Html.ValidationMessageFor(m=>m.ScopeOfWork[i].Materials[j].MaterialName) @Html.LabelFor(m=>m.ScopeOfWork[i]。材料[j]。数量,htmlAttributes:new{@class=“control label col-md-2”}) @Html.TextBoxFor(m=>m.ScopeOfWork[i].材料[j].数量,新{@class=“form control”}) @Html.ValidationMessageFor(m=>m.ScopeOfWork[i].Materials[j].Quantity) @LabelFor(m=>m.ScopeOfWork[i]。材料[j]。成本,htmlAttributes:new{@class=“control label col-md-2”}) @Html.TextBoxFor(m=>m.ScopeOfWork[i].材料[j].成本,新{@class=“form control”}) @Html.ValidationMessageFor(m=>m.ScopeOfWork[i].Materials[j].Cost) 类别 @Html.DropDownListFor(m=>m.ScopeOfWork[i].Materials[j].SelectedCategory,Model.ScopeOfWork[i].Materials[j].CategoryList,“请选择”,htmlAttributes:new{@class=“form control”}) } } } 工作范围 布料
布料 量 费用 @*下降*@ 类别 --挑选-- 变量形式=$('form'); 变量范围=$(“#新闻范围”); var材料=$(“#新材料”); var categories=@Html.Raw(Json.Encode(Model.CategoryList)); 表单.on('click','addmaterial',函数(){ var clone=material.clone(); var scopeIndex=$(this).closest('.scope').find('.scopeIndex').val(); html($(clone.html().replace(/#/g,scopeIndex)); var materialIndex=新日期().getTime(); html($(clone.html().replace(/%/g,materialIndex)); //下拉列表 var select=clone.find('.category'); $。每个(类别、功能(索引、项目){ select.append($('').val(item.Value).text(item.text)); }); $(this).close('.materials').append(clone.html()); 表单数据('验证器',空); $.validator.unobtrusive.parse(表单); }); $('#addScope')。单击(函数(){ var clone=scope.clone(); var scopeIndex=new Date().getTime(); html($(clone.html().replace(/#/g,scopeIndex)); $('#scopes').append(clone.html()); 表单数据('验证器',空); $.validator.unobtrusive.parse(表单); });
控制器:

 [HttpPost]
        public ActionResult _CreateProject(ProjectViewModel project)
        {
            tblProject projectModel = new tblProject();
            tblScopeOfWork scopeModel = new tblScopeOfWork();
            tblMaterial materialModel = new tblMaterial();

            if (ModelState.IsValid)
            {
                projectModel.ProjectName = project.ProjectName;
                projectModel.ProjectLocation = project.ProjectLocation;
                projectModel.ProjectDescription = project.ProjectDescription;
                projectModel.WorkArea = project.WorkArea;
                projectModel.ModeOfPayment = project.ModeOfPayment;
                projectModel.Duration = project.Duration;
                projectModel.StartDate = project.StartDate;
                projectModel.EndDate = project.EndDate;
                projectModel.ProfitSupervision = project.ProfitSupervision;
                projectModel.ProjectStatus = project.ProjectStatus;
                projectModel.ForemanId = project.ForemanId;
                projectModel.ClientId = project.ClientId;

                db.tblProjects.Add(projectModel);
                db.SaveChanges();

                //Get the recently created ProjectId
                var recentProjectId = db.tblProjects.OrderByDescending(x => x.ProjectId).FirstOrDefault().ProjectId;

                //Get all values from List of ScopeOfWork
                //Add each ScopeOfWork to the database
                for (int scopeIndex = 0; scopeIndex < project.ScopeOfWork.Count; scopeIndex++)
                {
                    scopeModel = new tblScopeOfWork();
                    scopeModel.ScopeOfWork = project.ScopeOfWork[scopeIndex].ScopeOfWorkName;
                    scopeModel.ProjectId = recentProjectId;

                    db.tblScopeOfWorks.Add(scopeModel);
                    db.SaveChanges();

                    //Get the recently created ScopeOfWorkId
                    var recentScopeOfWorkId = db.tblScopeOfWorks.OrderByDescending(x => x.ScopeOfWorkId).FirstOrDefault().ScopeOfWorkId;

                    //Get all materials from its corresponding ScopeOfWork and save to database
                    for (int materialIndex = 0; materialIndex < project.ScopeOfWork[scopeIndex].Materials.Count; materialIndex++)
                    {
                        materialModel = new tblMaterial();
                        materialModel.Description = project.ScopeOfWork[scopeIndex].Materials[materialIndex].MaterialName;
                        materialModel.Quantity = project.ScopeOfWork[scopeIndex].Materials[materialIndex].Quantity;
                        materialModel.Cost = project.ScopeOfWork[scopeIndex].Materials[materialIndex].Cost;
                        materialModel.ScopeOfWorkId = recentScopeOfWorkId;
                        materialModel.CategoryId = project.ScopeOfWork[scopeIndex].Materials[materialIndex].SelectedCategory;
                        db.tblMaterials.Add(materialModel);
                    }
                }
                db.SaveChanges();
            }

            project.ScopeOfWork = new List<ScopeOfWorkViewModel>
            {
                new ScopeOfWorkViewModel()
                {
                    Materials = new List<MaterialsViewModel>
                    {
                        new MaterialsViewModel()
                        {
                            CategoryList = new SelectList(db.tblCategories, "CategoryId", "CategoryName")
                        }
                    }
                }
            };
            return View(project);
        }
    }
[HttpPost]
公共行动结果\u CreateProject(项目视图模型项目)
{
tblProject projectModel=新tblProject();
tblScopeOfWork scopeModel=新的tblScopeOfWork();
TBL材料模型=新TBL材料();
if(ModelState.IsValid)
{
projectModel.ProjectName=project.ProjectName;
[Range(typeof(int), "0", "999")]
[Required(ErrorMessage = "Please enter proper value")]
public int? Quantity { get; set; }
[HttpPost]
public ActionResult _CreateProject(ProjectViewModel project)
{
    if (!ModelState.IsValid)
    {
        ConfigureViewModel(project);
        return View(project);
    }
    // code to initialize your data models, save and redirect
}

private void ConfigureViewModel(ProjectViewModel model)
{
    var categories = db.tblCategories;
    model.CategoryList = new SelectList(categories , "CategoryId", "CategoryName");
    foreach (var scope in model.ScopeOfWork)
    {
        foreach (var material in scope.Materials)
        {
            material.CategoryList = new SelectList(categories , "CategoryId", "CategoryName");
        }
    }
}