【问题标题】:No data is sent from form to action没有数据从表单发送到操作
【发布时间】:2019-10-20 19:49:07
【问题描述】:

我在 ASP.NET MVC 应用程序中使用 DataTables.js。我想在一个动作中处理服务器上的事情,但似乎没有数据从视图中的表单发送到动作。我已经构建了一些代码来测试这个例子:https://www.c-sharpcorner.com/article/using-datatables-grid-with-asp-net-mvc/

我有一个简单的看法:

<body>
  <div class="container">
      <br />
      <div style="width:90%; margin:0 auto;">
        <table id="demoGrid" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0">
          <thead>
            <tr>
              <th>CustomerID</th>
              <th>CompanyName</th>
              <th>ContactName</th>
            </tr>
          </thead>
        </table>
      </div>
    </div>
</body>

DataTable 是这样设置的:

$(document).ready(function () {
  $("#demoGrid").DataTable({
    "processing": true,
    "serverSide": true,
    "filter": true,
    "orderMulti": false,
    "pageLength": 5,
    "ajax": {
      "url": "/MOF2/Demo/LoadData",
      "type": "POST",
      "datatype": "json"
    }
  });
});

该动作还没有包含太多内容:

public ActionResult LoadData()
{
  var draw = Request.Form.GetValues("draw").FirstOrDefault();
  var start = Request.Form.GetValues("start").FirstOrDefault();
  var length = Request.Form.GetValues("length").FirstOrDefault();
  return View();
}

在阅读了https://datatables.net/ 和上面提到的示例之后,我希望能够在这里获得一些值。例如,我预计length 是 5。但我什么也没得到。例如Request.Form.GetValues("length") 为空。如果我检查 Request.Form.AllKeys 我得到一个空字符串。什么会导致这种情况? JavaScript 和 Ajax 发送表单数据需要什么才能被Request.Form.GetValues() 读取?

注意:我已经下载了上面示例的评论中提到的示例项目,它按预期工作。我还从该项目中删除了示例中未使用的大部分代码,它仍然有效。不过,我真的找不到示例项目和我的项目之间的区别。示例项目可以在这里找到:https://github.com/saineshwar/DataTablesGridExample

【问题讨论】:

  • 这是一个表单帖子还是数据在请求正文中
  • @Shantanu 我不完全确定这意味着什么以及如何回答这个问题。
  • 那么当您单击下一步(分页)时,您会得到任何值吗?
  • @HastaTamang 不。我相信我应该在页面加载时立即获取值,并且当我更改页面中的某些内容时,例如显示多少行 arr 或排序顺序。在我在问题中提到的示例项目中,我在加载页面和更改页面中的某些内容时都获得了值。我的直觉告诉我,我需要更改一些设置,以便在发出 ajax 请求时包含表单数据。我不知道是什么。
  • 您能否在网络选项卡中验证您的视图是否向您的操作方法发出表单请求?还要检查您是否有任何控制台错误

标签: c# ajax asp.net-mvc datatables


【解决方案1】:

我的一位同事找到了解决方案。应该更改 ajax 对象中的 URL,以便它使用 @Url.Action(),如下所示:

$(document).ready(function () {
  $("#demoGrid").DataTable({
    "processing": true,
    "serverSide": true,
    "filter": true,
    "orderMulti": false,
    "pageLength": 5,
    "ajax": {
      "url": "@Url.Action("LoadData", "Demo")",
      "type": "POST",
      "datatype": "json"
    }
  });
});

该项目使用Cookie less ASP.NET,这意味着会话ID 存储在URL 中。当我直接指出 URL 时,会话丢失了,表单数据也随之丢失。

我不完全确定会话、会话 id 和表单数据如何在这里准确地联系在一起,但在我的情况下使用 @Url.Action() 似乎是解决方案。

我在这里回答我自己的问题,以便遇到相同问题的其他人可以看到它是如何为我解决的。

【讨论】:

  • 所以你的网址应该是/Demo/LoadData,而不是/MOF2/Demo/LoadData
  • @HastaTamang 实际上应该是这样的:/(S(jv3otbn3ix5n3g22vby4loc4))/MOF2/Production/Nesting。 /MOF2 之前的随机字符串是会话 ID,它存储在 URL 中,而不是 cookie。由于这是无法预测的,我可以使用@Url.Action(),它知道会话 ID 并将其包含在一个完整的 URL 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多