Entity framework 如何从局部视图实现元素的验证规则

Entity framework 如何从局部视图实现元素的验证规则,entity-framework,partial-views,asp.net-core-3.1,validationattribute,Entity Framework,Partial Views,Asp.net Core 3.1,Validationattribute,我们正在开发一个.net core 3.1 MVC应用程序(实际使用MVVMC) 我们已经实现了自定义验证属性。并希望在服务器端和客户端对其进行检查 视图是标准视图,但是用户可以(通过按钮)向标准视图添加多个局部视图 在局部视图中,我们无法在输入字段中使用“asp for”标记帮助器,因为可以多次添加相同的项目,并且我们需要能够在ViewModel中创建一个列表,以排除所选的其他局部视图。这就是为什么我们试着自己制作标签 一旦通过ajax请求了部分视图,我们将再次调用验证程序。服务器验证有效,客

我们正在开发一个.net core 3.1 MVC应用程序(实际使用MVVMC)

我们已经实现了自定义验证属性。并希望在服务器端和客户端对其进行检查

视图是标准视图,但是用户可以(通过按钮)向标准视图添加多个局部视图

在局部视图中,我们无法在输入字段中使用“asp for”标记帮助器,因为可以多次添加相同的项目,并且我们需要能够在ViewModel中创建一个列表,以排除所选的其他局部视图。这就是为什么我们试着自己制作标签

一旦通过ajax请求了部分视图,我们将再次调用验证程序。服务器验证有效,客户端验证只对主视图上的输入有效,而不对部分视图上的输入有效。但是,在刷新后或服务器在验证错误后将用户发回时,客户端验证开始工作(因为站点已完全刷新,jquery验证将考虑部分视图的输入字段)

请查找以下代码:

验证属性的实现

public class AllowedExtensionsAttribute: ValidationAttribute, IClientModelValidator
{
    private readonly List<string> _extensions = new List<string>();

    public AllowedExtensionsAttribute(string extensions)
    {
        _extensions.Add(extensions);
    }

    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        if (value is IFormFile file)
        {
            var extension = Path.GetExtension(file.FileName);

            if (!_extensions.Contains(extension.ToLower()))
            {
                return new ValidationResult(ErrorMessage);
            }
        }

        return ValidationResult.Success;
    }

    public void AddValidation(ClientModelValidationContext context)
    {
        context.Attributes.Add("data-val", "true");
        context.Attributes.Add("data-val-extension", ErrorMessage);
    }
 

}
局部模型

[AllowedExtensions(".pdf", ErrorMessage = "This data type is not allowed!")]
public IFormFile PdfDocumentTwo { get; set; }
主视图

<form method="post" asp-controller="Home" asp-action="MainView" enctype="multipart/form-data">
    <div class="form-group top-buffer">
        <div class="row">
            <div class="col-2">
                <label asp-for="PdfDocumentOne" class="control-label"></label>
            </div>
            <div class="col-3">
                <input asp-for="PdfDocumentOne" class="form-control-file" accept="application/pdf" />
                <span asp-validation-for="PdfDocumentOne" class="text-danger"></span>
            </div>
        </div>
    </div>
    
    
    <div id="container">
        <div id="containerFull" class="form-group">
            <div class="row">
                <div class="col-2">
                    <label class="control-label">...</label>
                </div>
                <div class="col-10">
                    <div id="containerPartialView">
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-2">
                </div>
                <div class="col-3">
                    <button id="AddPartialView" type="button" class="form-control">...</button>
                </div>
            </div>
        </div>
    </div>

    ...
    
     <div class="form-group top-buffer">
         <div class="row">
             <div class="col-2">
                 <input type="submit" value="Submit" class="form-control" id="checkBtn" />
             </div>
         </div>
     </div>
</form>
家庭控制器

[HttpPost]
public IActionResult MainView(MainViewModel vm)
{
    if (vm == null)
    {
        return RedirectToAction("Index");
    }

    DatabaseHelper.GetMainViewModel(vm);
        
    if (!ModelState.IsValid)
    {
        @ViewData["StatusMessageNegative"] = "The entered data is not valid. Please scroll down to correct your data.";
         return View(vm);
     }
    
     return RedirectToAction("UploadDocument", new { Id = vm.Id});
 }


 [HttpGet]
 public ActionResult AddPartialView(int index)
 {
     PartialViewModel pvm = DatabaseHelper.GetPartialViewModel(index);
     return PartialView("Partial", pvm);
 }

在互联网上搜索后,我们发现了以下参数(data ajax=“true”)。但是,我们不知道将其放置在何处或如何正确使用。

加载局部视图后是否尝试重新应用验证

$.ajax({
    url: '/Home/AddPartialView?index=' + i,
    success: function (data) {
        $('#containerPartialView').append(data);
        $().rules('remove','extension');
        jQuery.validator.unobtrusive.adapters.addBool("extension");
    },
    error: function (a, b, c) {
        console.log(a, b, c);
    }
}).then(function () {
$("form").each(function () { $.data($(this)[0], 'validator', false); });
$.validator.unobtrusive.parse("form");
}))

function AddPartialView() {
    var i = $(".partialView").length;
    $.ajax({
        url: '/Home/AddPartialView?index=' + i,
        success: function (data) {
            $('#containerPartialView').append(data);
            $().rules('remove','extension');
            jQuery.validator.unobtrusive.adapters.addBool("extension");
        },
        error: function (a, b, c) {
            console.log(a, b, c);
        }
    });
}

$('#AddPartialView').click(function () {
    AddPartialView();
});

jQuery.validator.addMethod("extension",
    function (value, element, param) {

        var extension = value.split('.').pop().toLowerCase();

        if ($.inArray(extension, ['pdf']) == -1) {
            return false;
        }
        return true;
    });

jQuery.validator.unobtrusive.adapters.addBool("extension");
[HttpPost]
public IActionResult MainView(MainViewModel vm)
{
    if (vm == null)
    {
        return RedirectToAction("Index");
    }

    DatabaseHelper.GetMainViewModel(vm);
        
    if (!ModelState.IsValid)
    {
        @ViewData["StatusMessageNegative"] = "The entered data is not valid. Please scroll down to correct your data.";
         return View(vm);
     }
    
     return RedirectToAction("UploadDocument", new { Id = vm.Id});
 }


 [HttpGet]
 public ActionResult AddPartialView(int index)
 {
     PartialViewModel pvm = DatabaseHelper.GetPartialViewModel(index);
     return PartialView("Partial", pvm);
 }
$.ajax({
    url: '/Home/AddPartialView?index=' + i,
    success: function (data) {
        $('#containerPartialView').append(data);
        $().rules('remove','extension');
        jQuery.validator.unobtrusive.adapters.addBool("extension");
    },
    error: function (a, b, c) {
        console.log(a, b, c);
    }
}).then(function () {
$("form").each(function () { $.data($(this)[0], 'validator', false); });
$.validator.unobtrusive.parse("form");