更新操作为什么没有发布任何数据?

5

我正在使用带有内联编辑功能的Kendo网格。当我点击“更新”按钮时,会向我的控制器方法发出POST请求,该方法具有以下签名。控制器动作被触发,所以POST正常工作。

[HttpPost]
    public HttpResponseMessage SaveAccountAdmin(string jsonCompanyContacts)

然而,在更新操作中,POST数据从未到达 - 它始终为null。
update: {
              url: "/Company/SaveAccountAdmin",
              contentType: "application/json; charset=utf-8",
              type: "POST",
              dataType: "json",
              data: {
                  jsonCompanyContacts: "John Doe"
              }
          },

这里是完整的数据源代码。
var dataSource = new kendo.data.DataSource(
  {
      batch: false,
      pageSize: 10,

      transport: {
          create: {
              url: "/Company/SaveAccountAdmin",
              contentType: "application/json; charset=utf-8",
              type: "POST",
              dataType: "json"
          },

          read: {
              url: "/Company/ReadAccountAdmin"
          },

          update: {
              url: "/Company/SaveAccountAdmin",
              contentType: "application/json; charset=utf-8",
              type: "POST",
              dataType: "json",
              data: {
                  jsonCompanyContacts: "John Doe"
              }
          },
          //destroy: {},

          parameterMap: function (data, type) {
              return kendo.stringify(data);
          }
      },

这也不起作用:
update: {
              url: "/Company/SaveAccountAdmin",
              contentType: "application/json; charset=utf-8",
              type: "POST",
              dataType: "json",
              //data: { "jsonCompanyContacts": kendo.stringify({ jsonCompanyContacts: "John Doe" }) }

              data: { "jsonCompanyContacts": "John Doe" }
          },
          //destroy: {},

          parameterMap: function (data, type) {
              return kendo.stringify(data);
          }

但这个可以工作- 为什么?

update: {
              url: "/Company/SaveAccountAdmin",
              contentType: "application/json; charset=utf-8",
              type: "POST",
              dataType: "json",
              //data: { "jsonCompanyContacts": kendo.stringify({ jsonCompanyContacts: "John Doe" }) }

              //data: { "jsonCompanyContacts": "John Doe" }
          },
          //destroy: {},

          parameterMap: function (data, type) {
              return kendo.stringify({ "jsonCompanyContacts": "John Doe" });
          }

哦,我正在使用jQuery 1.8.3。 - Greg
3个回答

1
尝试在您的更新定义中执行以下操作:
  update: {
      url: "/Company/SaveAccountAdmin",
      contentType: "application/json; charset=utf-8",
      type: "POST",
      dataType: "json",
      data:{ "jsonCompanyContacts":  kendo.stringify({ jsonCompanyContacts: "John Doe"  })}
      }

你可能需要在parameterMap中移除操作才能使其正常工作。最重要的是,你想要发布一个与控制器中相同名称的变量。该变量应包含你的字符串数据。
如果需要,你也可以将此操作移至parameterMap中。

感谢您的回复,Logard。我尝试了您的代码,并将参数映射留在其中(因为我认为内联编辑需要它),但它没有起作用。数据仍然为空。然后我注释掉了参数映射,POST请求也没有发生。 - Greg
我也尝试允许参数映射将数据字符串化(请参见我的更新)。仍然为空。 - Greg
谢谢Logard - 你的建议之一起作用了。我只是不知道为什么 :-) - Greg

1
该值未以字符串形式传递给控制器。尝试使用模型。这可能有所帮助:MVC3 & JSON.stringify() ModelBinding返回空模型

更新

您真的不想那样做。在这种情况下可能有效,但会自食其果。

模型

public class CompanyContactModel
{
    public string CompanyContacts { get; set; }
}

控制器签名

public JsonResult SaveAccountAdmin(CompanyContactModel companyContactModel)
...

更好
public JsonResult SaveAccountAdmin([DataSourceRequest]DataSourceRequest request, CompanyContactModel companyContactModel)
    ...
    Update and Return and put into List
    If error: ModelState.AddModelError(string.Empty, e.Message);

    DataSourceResult result = [Your Model List].ToDataSourceResult(request, ModelState);
    return Json(result, JsonRequestBehavior.AllowGet);
}

嗨Trey - 你能具体一点吗?毫无疑问,返回的kendo.stringify(data)正在发送一个字符串(尽管是JSON字符串)? - Greg
MVC控制器可以接受JSON模型作为实际模型;您不必将它们解析为字符串。修改您的控制器以接受与您发送的JSON格式匹配的模型。 - anaximander
@anaximander - 谢谢回复。我的操作方法中的模型(签名)会是什么样子?你能给我一个以FirstName,LastName为例的基本示例吗? - Greg
我快要解决这个问题了。有人能告诉我如何将网格数据传递给parameterMap吗?model不起作用。 - Greg
我没有使用Kendo MVC,所以我没有DataSourceRequest。我不明白如何将JSON格式的数据发送到CompanyContactModel对象中。难道它不必先进行反序列化吗?所以现在我的控制器签名看起来像这样[HttpPost] public JsonResult EditAccountAdmin(List<CompanyContact> jsonCompanyContacts)。现在的问题是获取parameterMap以发送网格数据。已经搜索了几个小时,但什么都没找到。 - Greg
实际上,我还没有解决任何问题。一步向前=十步向后。 我已经提出的工单有48小时服务水平协议,但是没有一个得到了答复。这在生产环境中不是一个可行的产品。感谢所有尝试帮助的人们。 - Greg

0

我曾经遇到过和你类似的问题。我从浏览器获取了值,但是它没有将这些值发布到更新操作模型中。

在我的情况下,我在模型上使用了"[ScriptIgnore(ApplyToOverrides = true)]",这个方法很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接