1

我使用 JQuery 和 Ajax 将 PUT 请求从我的视图发送到 Web API 控制器。它击中了我的 web api 控制器,但我的模型属性为空。

这是我的控制器代码:

public HttpResponseMessage Put(Int64 id, 
           [FromUri] CompanyInformation companyInformation) {
  try {
    if (ModelState.IsValid) {
      if (IsUniq(companyInformation.Name)) {
        _smUnitOfWork.CompanyInformations.Update(companyInformation);
        _smUnitOfWork.Save();
        return Request.CreateResponse(HttpStatusCode.OK, 
           string.Format(Messagess.UpdatedSuccess, 
                         companyInformation.Name));
      }
    }
    return Request.CreateResponse(HttpStatusCode.BadRequest, 
           string.Format(Messagess.AlreadyExist, 
                         companyInformation.Name, TypeNameMessages));
  } catch (Exception) {
    return Request.CreateResponse(HttpStatusCode.BadRequest, 
                                  Messagess.UnbaleToProcess);
  }
}

我的观点是:

  <div id="companySetup">
   @using (Html.BeginForm(null,null, FormMethod.Post, new{id="MyId"}))
   {
    <div>
        <div>
            <h2>Company Setup</h2>
            <ul>
                <li>
                    @Html.LabelFor(x => x.Name)
                    @Html.TextBoxFor(x => x.Name)
                </li>
                <li>
                    @Html.LabelFor(x => x.FirstAddress)
                    @Html.TextAreaFor(x => x.FirstAddress)
                </li>
                <li>@Html.LabelFor(x => x.SecondAddess)
                    @Html.TextAreaFor(x => x.SecondAddess)
                </li>
                <li>
                    @Html.LabelFor(x => x.ContractDeatils)
                    @Html.TextAreaFor(x => x.ContractDeatils)
                </li>
                <li>
                    @Html.LabelFor(x => x.Email)
                    @Html.TextBoxFor(x => x.Email, new { type = "email" })
                </li>
                <li>
                    @Html.LabelFor(x => x.Web)
                    @Html.TextBoxFor(x => x.Web)
                </li>
            </ul>
            @Html.HiddenFor(x => x.Id)
        </div>
        <div class="buttonAlinment">
            <input type="submit" value="Reset" />
            <input type="submit" value="Update" />
        </div>
    </div>
}

我的 JavaScript 是:

var updateCompanyInfo = function () {
var companyInformation = {
    "Name": $("#Name").val(),
    "FirstAddress": $("#FirstAddress").val(),
    "SecondAddess": $("#SecondAddess").val(),
    "ContractDeatils": $("#ContractDeatils").val(),
    "Web": $("#Web").val(),
    "Id": $("#Id").val(),
    "Email": $("#Email").val(),
};

$.ajax({
    url: '/api/CompanyInformation/' + $('#Id').val(),
    type: 'PUT',
    contentType: "application/json; charset=utf-8",
    data: { companyInformation: companyInformation },
    success: function (result) {
        alert("Done");
    }
});

};

在调试模式下它显示: 在此处输入图像描述

我不明白我错在哪里。

4

1 回答 1

2

这里有2个问题

  1. companyInformation期望来自 Uri,但随后您将在请求正文中发送数据。
  2. 目前正文的形式是 urlencoded 内容,但您指定的数据类型在application/json

有几种方法可以解决这个问题,这就是我要做的。首先,[FromUrl]companyInformation你的方法的参数中删除PUT

 public HttpResponseMessage Put(Int64 id, CompanyInformation companyInformation) 
 {
     ...
 }

然后用于JSON.stringify(...)在客户端将数据转换为 JSON:

$.ajax({
    url: '/api/CompanyInformation/' + $('#Id').val(),
    type: 'PUT',
     contentType: "application/json; charset=utf-8",
     data: JSON.stringify(companyInformation),
     success: function (result) {
         alert("Done");
     }
 });
于 2013-04-26T18:00:11.073 回答