通过jquery ajax在Web Api中显示无效的ModelState

时间:2015-11-05 13:33:33

标签: javascript jquery ajax knockout.js asp.net-web-api

我正在使用带有Knockoutjs的Web Api。我试图弄清楚如何将无效模型状态的细节返回给用户。

这是在VB我非常抱歉这不是我的错!!! (请随意给我许多减分,因为我理解这是vb)。

好的,我们去吧

所以我在模型上放了一个必填字段。

 <Required>
    Public Property test() As String
        Get
            Return m_test
        End Get
        Set(value As String)
            m_test = value
        End Set
    End Property
    Private m_test As String
控制器中的

我有保存功能。

<HttpPost>
    Public Async Function Save(data As Origin_SingleOvrUndr_main_rewrite_vm) As Task(Of IHttpActionResult)
        If ModelState.IsValid Then
            Await Origin_SingleOvrUndr_main_rewrite_vmRepository.SaveDataAsync(data)
            Return Ok()
        Else
            Return BadRequest(ModelState)
        End If
    End Function

在我的html页面上,我正在调用save。

this.saveData = function () {
                var data = ko.toJSON(self);
                $.ajax({
                    url: "api/VMOriginSingleOvrUndrMainRewrite",
                    type: "POST",
                    data: data,
                    datatype: "json",
                    processData: false,
                    contentType: "application/json; charset=utf-8",
                    success: function (result) {
                        alert('save successfull');
                    },
                    error: function (xhr, status, error) { 
                        var err = eval("(" + xhr.responseText + ")");
                        alert(err.Message);

                    },
                });
            }

所以我故意遗漏帖子上的必填字段,看看会有什么回应。所以响应是(通过点击F12并查看IE11中的响应主体)

{"Message":"The request is invalid.","ModelState":{"data.test":["The test field is required."]}}

然而,只显示网页上的提醒。消息(请求无效)。

如何在jquery ajax错误部分中显示警报,是否需要有关测试字段的部分? (以及可能存在的任何其他消息?)

1 个答案:

答案 0 :(得分:0)

您可以使用{k}视图中显示的名为observableArray的{​​{1}}。

以下是与错误相对应的视图和模型的代码段。它需要原始响应,提取错误,并在视图中显示它们:

errors

<div class="errors" data-bind="foreach: errors">
   <div>
     <p data-bind="text:prop"></p>
     <ul data-bind="foreach: errors">
        <li data-bind="text: $data"></li>
     </ul>
   </div>
</div>
// see http://knockoutjs.com/documentation/observableArrays.html for info on removeAll
var vm = { errors: ko.observableArray([]) }


var r = {"Message":"The request is invalid.","ModelState":{"data.test":["The test field is required."]}};

vm.errors.removeAll();

for(p in r.ModelState) { 
  if (r.ModelState.hasOwnProperty(p)) { 
    vm.errors.push({prop: p, errors: r.ModelState[p]}); 
  }
}

ko.applyBindings(vm);
.errors {
  border: solid red 1px;
  border-radius: 10px 2px 2px;
  background-color: #FF8;
  color: #D10;
  padding: 10px;
  font-family: 'Segoe UI', 'Arial';
  }