【问题标题】:How to send data from javascript to ASP.NET MVC controller using URL如何使用 URL 将数据从 javascript 发送到 ASP.NET MVC 控制器
【发布时间】:2013-09-28 17:14:33
【问题描述】:

我需要一些帮助。我使用带有 JavaScript 和 Knockout 的 ASP.NET MVC4 编写小应用程序,我无法将数据从 javascript 发送到 MVC 控制器,反之亦然。比如JS的部分是这样的:

JavaScript

self.Employer = ko.observable();
self.AboutEmployer = function (id) {
            $.ajax({                    
                    Url.Action("GetEmployer", "Home")
                    cache: false,
                    type: 'GET',
                    data: "{id:" + id + "}",
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    success: function (data) {
                        self.Employer(data);
                    }
                }).fail(
                function () {
                    alert("Fail");
                });
         };

在 ASP.NET MVC Home Controller 中,我通过 ID 获取雇主并将其作为 Json 返回:

C#

public JsonResult GetEmployer(int id)
    {
        var employer = unit.Repository<Employer>().GetByID(id);
        return Json(employer, JsonRequestBehavior.AllowGet);
    }

我的视图返回另一个控制器 (Home/KnockOutView)。我的视图还获得了另一个对象,根据收到的内容,有不同的外观:

HTML

...
<b>About Company: </b><a href="#" data-bind="click: $root.AboutEmployer.bind($data, Vacancy().EmployerID)">
<span data-bind="    text: Vacancy().Employer"></span></a>
<div data-bind="if: Vacancy">
    <div id="VacancyDescription"><span data-bind="text:DescriptionShort"></span>
    </div>
</div>
<div data-bind="if: Employer">
    <div data-bind="text: Employer().EmployerDescription"></div>
</div>

一切都很好,我在 JS 中接收 Vacancy 和 Employer 对象,并使用 Knockout 在 HTML 中显示它,但我的 URL 一直都是一样的!!! 但我想随时更改 URL,当我得到空缺或雇主时。 例如,如果我想获取 Employer,使用 GetEmployer 方法,URL 应该是这样的:~/Home/GetEmployer?id=3 如果我改变这串代码 Url.Action("GetEmployer", "Home") url: window.location.href = "/home/GetEmployer?id=" + id 的 URL 将被更改,但控制器会返回一个 Json 对象并以 Json 格式在窗口中显示它。 请帮助我更改 URL 并从 URL 获取控制器中的信息。 谢谢。

【问题讨论】:

  • 在发布 JSON 时必须小心。您的 data 不是有效的 JSON,因为它缺少属性名称周围的引号。获取 JSON 字符串的最简单方法是在常规 javascript 对象上使用 JSON.stringify,而不是尝试自己构建字符串。 (确保您使用的是相当新的浏览器(IE8+ 或真正的浏览器),或者如果您必须支持 IE7,则使用像 json2.js 这样的库)

标签: c# javascript asp.net knockout.js


【解决方案1】:

由于 MVC 在处理到同一视图的路由时有点烦人,我已经成功地做到了:

self.Employer = ko.observable();
self.AboutEmployer = function (id) {
            $.ajax({                    
                    url: "@Url.Action("GetEmployer", "Home", new { id = "PLACEHOLDER"})".replace("PLACEHOLDER", id),
                    cache: false,
                    type: 'GET',
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    success: function (data) {
                        self.Employer(data);
                    }
                }).fail(
                function () {
                    alert("Fail");
                });
         };

您可以使用标准的url: "@Url.Action("GetEmployer", "Home")/" + id,但是在刷新时,具有现有 ID 的路由会保留在后续调用中,因此它开始附加 id,这显然不起作用。通过在调用中指定 ID,该行为不再存在。

【讨论】:

    【解决方案2】:

    使用像这样的数据参数{id:id, otherPara:otherParaValue}

     $.ajax({                    
         url:Url.Action("GetEmployer", "Home")
         type: 'GET',
         data: {id:id},
         contentType: 'application/json; charset=utf-8',
         dataType: "json",
         success: function (data) {
             alert(data)
         }
     });
    

    【讨论】:

      【解决方案3】:

      试试下面的代码,希望对你有帮助

      此代码适用于 %100 ,请根据您的情况更改下面的文本框

      HTML

      <input type="text" id="UserName" name="UserName" />
      <input type="button" onclick="MyFunction()"value="Send" />
      
      <div id="UpdateDiv"></div> 
      

      Javascript:

      function MyFunction() {
          var data= {
              UserName: $('#UserName').val(),
          };
          $.ajax({
              url: "/Home/GetEmployer",
              type: "POST",
              dataType: "json",  
              data: JSON.stringify(data),
              success: function (mydata) {
                  $("#UpdateDiv").html(mydata);
                  history.pushState('', 'New URL: '+href, href); // This Code lets you to change url howyouwant
              });
              return false;
          }
      }
      

      控制器:

      public JsonResult GetEmployer(string UserName)
      {
          var employer = unit.Repository<Employer>().GetByID(id);
          return Json(employer, JsonRequestBehavior.AllowGet);
      }
      

      【讨论】:

      • 我有类似的问题。我正在查看这段代码,但不太了解 ASP 端发生的所有事情。请解释一下好吗?
      【解决方案4】:

      在我看来,最好的导航方式是使用 sammy.js。这是一篇关于kazimanzurrashid.com的帖子

      【讨论】:

        【解决方案5】:

        这是我的控制器操作。

        [HttpPost]
            public ActionResult ActionName(string x, string y)
            {
                //do whatever
                //return sth :)
        
            }
        

        我的帖子操作在这里。

        <script type="text/javascript">
                function BayiyeCariEkle(){
        
                   var sth= $(#itemID).text();
        
                   var sth2= $(#itemID2).text();
        
                   $.post("/ControllerName/ActionName", { x: sth, y: sth2});
        
                 }
        </script>
        

        【讨论】:

        • 如何指定是json类型?
        • 我只是在这里发送字符串。 -“字符串化”或“序列化”JSON 对象,我使用 json.org 提供的 JSON 插件进行序列化 JSONstring = JSON.stringify(entry);
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多