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

Posted

技术标签:

【中文标题】为啥更新操作没有发布任何数据?【英文标题】:Why is the update operation not posting any data?为什么更新操作没有发布任何数据? 【发布时间】:2013-01-24 07:29:58 【问题描述】:

我正在使用带有内联编辑功能的 Kendo Grid。当我单击“更新”按钮时,会使用此签名对我的控制器方法进行 POST。控制器动作被命中,所以 POST 工作正常。

[HttpPost]
    public HttpResponseMessage SaveAccountAdmin(string jsonCompanyContacts)

但是更新操作中的 POST 数据永远不会到达 - 它始终为空。

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 【参考方案1】:

该值不作为字符串传递给控制器​​。尝试使用模型。这可能会有所帮助:MVC3 & JSON.stringify() ModelBinding returns null model

更新

你真的不想那样做。可能在一种情况下有效,但您是在自取其辱。

型号

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 字符串)? MVC 控制器可以接受 JSON 模型作为实际模型;您不必将它们解析为字符串。更改您的控制器以接受与您发送的 JSON 格式匹配的模型。 @anaximander - 感谢您的回复。我的动作方法中的模型(签名)会是什么样子?你能给我一个名字,姓氏的基本例子吗? 我即将解决这个问题。谁能告诉我如何将网格数据传递给parameterMap?模型不起作用。 我没有使用 Kendo MVC,所以我没有 DataSourceRequest。我不明白如何将 json 格式的数据发送到 CompanyContactModel 对象中。是否必须先反序列化?所以现在我的控制器签名看起来像 [HttpPost] public JsonResult EditAccountAdmin(List jsonCompanyContacts)。现在的问题是让 parameterMap 发送网格数据。一直在寻找几个小时。什么都没有【参考方案2】:

尝试在您的更新定义中这样做:

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

您可能必须删除参数映射中的操作才能使其正常工作。最主要的是您要发布一个与控制器中的同名 的变量。该变量应包含您的字符串化数据。

如果需要,您也可以将此操作移至您的 parameterMap。

【讨论】:

感谢洛加德的回复。我尝试将您的代码留在参数映射中(因为我认为内联编辑需要它)但它没有用。数据仍然为空。然后我注释掉了参数映射并且 POST 没有发生。 我还尝试允许参数映射对数据进行字符串化(参见我的更新)。仍然为空.. 感谢 Logard - 您的建议之一奏效了。我只是不知道为什么:-)【参考方案3】:

我遇到了和你类似的问题。我从 broswer 获取值,但它没有将值发布到更新操作模型。

在我的例子中,我在模型上使用了“[ScriptIgnore(ApplyToOverrides = true)]”,效果很好。

【讨论】:

以上是关于为啥更新操作没有发布任何数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥变量没有更新?任何逻辑

尽管状态更新,为啥 vuex 组件没有更新?

为啥 EF 核心忽略我对数据集的更新?

我用的是thinkphp3.2版本,为啥我怎么编写数据库都更新不了数据

为啥我工作时状态栏没有更新?

为啥我的验证器没有在 Laravel 中验证?