【问题标题】:Need to pass the Rowdata to another view on link click需要在链接点击时将 Rowdata 传递给另一个视图
【发布时间】:2014-10-13 16:38:04
【问题描述】:

这是我的 JQGrid 代码:

click: function (e) {
                            debugger;
                            var id = $(e.target).closest("tr.jqgrow").attr("id");
                            rowdata = jQuery("#EmpTable").getRowData(id);
                            Data = { Id: rowdata.Id, Name: rowdata.Name, Designation: rowdata.Designation };

                            var url = 'http://localhost:50428/Script/Edit/';
                           return $.post(url, Data);

                                  } 

这是我收集数据的控制器代码

 [HttpPost]
      public ActionResult Edit(FormCollection form)
      {
          gridmodel properties = new gridmodel();

          properties.Id = Convert.ToInt32(form["id"]);
          properties.Name = form["Name"];
          properties.Designation = form["Designation"];
          ViewBag.id = properties.Id;
          ViewBag.name = properties.Name;
          ViewBag.designation = properties.Designation;
          return View();
      }

现在这是我的查看代码

从控制器传递到视图的数据

 @model MVC5_JQGrid.Models.gridmodel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Edit</title>
</head>
<body>
  <div>
      Id:@ViewBag.id
      <br />
      Name:@ViewBag.name
      <br />
      Designation:@ViewBag.designation

    </div>
</body>
</html>

但我无法加载此页面,但在网络中 ---> 响应正文我可以看到这些值已分配

更新

您好 Venkata,感谢您的回答,我将保留您提到的要点,并从我这边 +1 进行观察,解决问题。它已从 oleg 建议中解决:(这是 Oleg 给出的答案)您的问题的原因是 $.post(url, Data); 的使用它只是发送关于 $.ajax({url: "/Script/Edit", data: Data, type: "POST"}); 的数据。您需要改为 $.submit 。如果您要使用 HTTP GET,那么您可以将包含参数的新 URL 分配给 location.href(类似于 location.href = "/Script/Edit?" + $.param(Data))。在 HTTP POST 的情况下,需要使用包含的元素构建(或者只是在页面上隐藏表单,其中包含具有所需名称属性的所有必需元素)并使用 $.submit。 感谢 oleg 和 Venkata 的帮助

【问题讨论】:

  • 尝试移除强制转换 IEnumerable 并查看 ViewData 是否打印出 div 中的值?话虽如此,我会使用其中包含 GridModel 的 ViewModel 类,而不是使用 ViewData
  • tranceporter 感谢回复帖子,我已经按照你的方式改了但是没有运气仍然无法查看另一个视图,我仍然居住在网格页面中
  • 请将解决方案作为新答案发布。
  • 当然请找到解决办法

标签: c# jquery asp.net-mvc jqgrid


【解决方案1】:

您的代码需要进行少量更改:

观察和注意事项:
在修复之前,我们应该在这里了解一些关于架构、控制流和标准的要点

  • jQuery AJAX 请求获得对其成功回调处理程序的响应(在您的代码中您错过了成功调用)
  • 在成功函数中,我们应该在现有页面中构建或附加或设置 HTML 到目标占位符标记(假设您在 jqGrid 页面中有像 &lt;div id='editSection'&gt;...&lt;/div&gt; 这样的编辑部分的 div。您应该将 responseView 绑定到 editSection div)
  • 当我们发送 AJAX 请求时:在 Controller.Action 中而不是 return View(); 我们应该有 return PartialView();
  • 在您的view.cshtml 中,优先使用Model 而不是ViewData 绑定元素。如果您在 Action 中执行return PartialView(model);,则可以获取模型以查看。
  • 尽量减少ViewDataViewBagview.cshtml 中的使用。视图中也不推荐使用业务逻辑。
  • 尝试Follow best practices: Capitalization Conventions(在您的代码中将gridmodel类名更改为GridModel
  • 默认情况下,路由 url 模板将具有 {controller}/{action}(从您的 url ScriptcontrollerEditaction
  • 确保您传递正确的控制器和操作名称(Edit 操作是否位于名称为 ScriptController 的控制器中?)

JavaScript JQGrid 代码的变化:

url = '/Script/Edit/';
return $.post(url, Data).success(function(response){
           //response datatype can be JSON or XML or HTML or text (In your case HTML Edit.cshtml View)
           //update you target html tag with response view.
           $('#editSection').html(responseView);
       });

控制器的变化:

  [HttpPost]
  public ActionResult Edit(FormCollection form)
  {
      var properties = new gridmodel();

      properties.Id = Convert.ToInt32(form["id"]);
      properties.Name = form["Name"];
      properties.Designation = form["Designation"];

      ViewBag.id = properties.Id;
      ViewBag.name = properties.Name;
      ViewBag.designation = properties.Designation;

      return PartialView();
  }

如果操作只需要输入参数 id、name 和 designation,您可以像下面这样更改编辑操作

    [HttpPost]
    public ActionResult Edit(int id, string name, string designation)
    {
        var gridModel = new GridModel();

        gridModel.Id = id;
        gridModel.Name = name;
        gridModel.Designation = designation;

        ViewBag.id = gridModel.Id;
        ViewBag.name = gridModel.Name;
        ViewBag.designation = gridModel.Designation;

        return PartialView(gridModel);
    }

【讨论】:

    【解决方案2】:

    您好 Venkata,感谢您的回答,我将保留您提到的要点,并从我这边 +1 进行观察,解决问题。它已从 oleg 建议中解决:(这是 Oleg 给出的答案)您的问题的原因是 $.post(url, Data); 的使用它只是发送关于 $.ajax({url: "/Script/Edit", data: Data, type: "POST"}); 的数据。您需要改为 $.submit 。如果您要使用 HTTP GET,那么您可以将包含参数的新 URL 分配给 location.href(类似于 location.href = "/Script/Edit?" + $.param(Data))。在 HTTP POST 的情况下,需要使用包含的元素构建(或者只是在页面上隐藏表单,其中包含具有所需名称属性的所有必需元素)并使用 $.submit。感谢 oleg 和 Venkata 的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多