Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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中的BadRequest返回到Microsoft jQuery Unobtrusive Ajax post时,ModelState未定义_Jquery_Ajax_Asp.net Core Mvc_Unobtrusive Ajax - Fatal编程技术网

将ASP.Net核心MVC中的BadRequest返回到Microsoft jQuery Unobtrusive Ajax post时,ModelState未定义

将ASP.Net核心MVC中的BadRequest返回到Microsoft jQuery Unobtrusive Ajax post时,ModelState未定义,jquery,ajax,asp.net-core-mvc,unobtrusive-ajax,Jquery,Ajax,Asp.net Core Mvc,Unobtrusive Ajax,问题 我试图使用BadRequest(ModelState)从ModelState返回服务端验证错误,但是当我试图从xhr.responseText分配jquerymodelstate时,我在javascript中遇到了未定义的错误。我正在使用ASP.Net Core 1.0.1和Microsoft.jQuery.Unobtrusive.Ajax 3.2.3 代码 控制器动作 公共异步任务应用程序通信(制裁视图模型) { 尝试 { if(ModelState.IsValid) { //更新数据库

问题

我试图使用BadRequest(ModelState)从ModelState返回服务端验证错误,但是当我试图从xhr.responseText分配jquerymodelstate时,我在javascript中遇到了未定义的错误。我正在使用ASP.Net Core 1.0.1和Microsoft.jQuery.Unobtrusive.Ajax 3.2.3

代码

控制器动作

公共异步任务应用程序通信(制裁视图模型)
{
尝试
{
if(ModelState.IsValid)
{
//更新数据库
返回重定向操作(“详细信息”);
}
其他的
{
返回请求(ModelState);
}
}
捕获(例外情况除外)
{
返回状态代码(500,例如ToString());
}
}
视图(JavaScript)

函数AjaxOnFailure(xhr、状态、错误){
console.log(xhr.responseText);
var errText=“”;
var响应=null;
var错误=[];
var errorsString=“”;
如果(xhr.status==400){
试一试{
response=JSON.parse(xhr.responseText);
控制台日志(响应);
}
捕获(e){
errText=“Error:”+xhr.status+“-”+错误;
}
}
if(响应!=null){
var modelState=response.modelState;//返回未定义的
console.log(modelState);
for(modelState中的var键){
if(modelState.hasOwnProperty(键)){
对于(var i=0;i“+modelState[key][i];
错误。推送(modelState[key][i]);
}
}
}
}
如果(errorsString!=“”){
errText=“验证错误:”+errorsString;
} 
console.log(errText);
var errIcon=“fa感叹号圆”
document.getElementById(“modalErrorIcon”).className=errIcon;
document.getElementById(“modalErrorText”).innerHTML=errText;
}
视图(表格)


&时代;接近
制裁理由
拯救
取消
结果

问题

  • 为什么在ajax响应中没有定义ModelState

  • 在服务器端验证之后使用javascript显示验证错误有什么意义?我这样问是因为我假设只有当用户禁用了javascript时,服务器端验证才会生效,因此绕过了客户端验证。因此,javascript如何执行以显示服务器ModelState返回的验证错误,因为它仍然处于禁用状态


  • 您的ModelState未定义,因为您没有从服务器返回它,请参阅response@madalinivascu我不明白你的意思。我的控制器中的这一行是否从服务器返回ModelState
    returnbadRequest(ModelState)?我可以看到服务器返回了正确的服务器验证错误(请参阅控制台日志映像)在控制台日志图像中,您在哪里看到对象属性
    ModelState
    我只看到第一个项值为
    的数组id,值“”无效
    @madalinivascu我现在明白您的意思了,因此为了清楚起见,我添加了表单代码。有一个隐藏的输入字段
    ,在点击服务器时为空。从服务器返回的ModelState数组的密钥ID与匹配消息
    值“”无效
    。我的js代码基于这个示例,这表明使用jquery可以从执行
    JSON.parse(xhr.responseText)
    中提取ModelState对象。也许这与jquery unobtrusive ajax不兼容?您当前的语法似乎没有返回键值对,只有ModelState的值您的ModelState是未定义的,因为您没有从服务器返回它,请参见response@madalinivascu我不明白你的意思。我的控制器中的这一行是否从服务器返回ModelState
    returnbadRequest(ModelState)?我可以看到服务器返回了正确的服务器验证错误(请参阅控制台日志映像)在控制台日志图像中,您在哪里看到对象属性
    ModelState
    我只看到第一个项值为
    的数组id,值“”无效
    @madalinivascu我现在明白您的意思了,因此为了清楚起见,我添加了表单代码。有一个隐藏的输入字段
    ,在点击服务器时为空。从服务器返回的ModelState数组的密钥ID与匹配消息
    值“”无效
    。我的js代码基于这个示例,这表明使用jquery可以从执行
    JSON.parse(xhr.responseText)
    中提取ModelState对象。也许这与jquery unobtrusive ajax不兼容?您当前的语法似乎只返回ModelState的值,而不返回键值对
    public async Task<IActionResult> ApplySanction(SanctionViewModel model)
    {
        try
        {
            if (ModelState.IsValid)
            {
                //update database
                return RedirectToAction("Details");
            }
            else
            {
                return BadRequest(ModelState);
            }
        }
        catch (Exception ex)
        {
            return StatusCode(500, ex.ToString());
        }
    }
    
    function AjaxOnFailure(xhr, status, error) {
        console.log(xhr.responseText);
    
        var errText = "";
        var response = null;
        var errors = [];
        var errorsString = "";
        if (xhr.status == 400) {
            try {
                response = JSON.parse(xhr.responseText);
                console.log(response);
            }
            catch (e) {
                errText = "Error: " + xhr.status + " - " + error;
            }
        }
        if (response != null) {
            var modelState = response.ModelState; //This is returning undefined
            console.log(modelState);
            for (var key in modelState) {
                if (modelState.hasOwnProperty(key)) {
                    for (var i = 0; i < modelState[key].length; i++) {
                        errorsString = (errorsString == "" ? "" : errorsString + "<br/>") + modelState[key][i];
                        errors.push(modelState[key][i]);
                    }
                }
            }
        }
        if (errorsString != "") { 
            errText = "Validation Error: " + errorsString;
        } 
    
        console.log(errText);
        var errIcon = "fa fa-exclamation-circle"
        document.getElementById("modalErrorIcon").className = errIcon;
        document.getElementById("modalErrorText").innerHTML = errText;
    }
    
    <form asp-controller="Client" asp-action="ApplySanction" class="form-horizontal" data-ajax="true" data-ajax-method="POST" data-ajax-success="CloseModal(xhr, status, '#sanctionModal')" data-ajax-failure="AjaxOnFailure(xhr, status, error)">
        <div class="modal fade" id="sanctionModal" tabindex="-1" role="dialog" aria-labelledby="sanctionModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
                        <h4 class="modal-title" id="sanctionModalLabel">Sanction Reason</h4>
                    </div>
                    <div class="modal-body">
                        <input type="hidden" asp-for="ID" />
                        <div class="form-group">
                            <div class="col-sm-10">
                                <textarea asp-for="SanctionReason" class="form-control" autofocus></textarea>
                                <span asp-validation-for="SanctionReason" class="text-danger" />
                            </div>
                        </div>
                    </div>
                    <div class="modal-footer">
                        <div class="text-danger pull-left">
                            <i id="modalErrorIcon" class=""></i>
                            <span id="modalErrorText"></span>
                        </div>
                        <button type="submit" class="btn btn-primary">Save</button>
                        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                    </div>
                </div>
            </div>
        </div>
    </form>