【问题标题】:JQUERY ajax passing value from MVC View to ControllerJQUERY ajax 将值从 MVC 视图传递到控制器
【发布时间】:2012-01-19 03:28:01
【问题描述】:

我想要的是将 txtComments 的值从视图(使用 jquery/ajax)传递给控制器​​。

问题是 ajax/jquery 不接受脚本标签作为字符串。意思是,当我在 txtComments 中输入任何脚本/html 标记时,ajax 会进入错误函数并且无法进入控制器。

这里是 jQuery:

        $('#btnSaveComments').click(function () {
            var comments = $('#txtComments').val();
            var selectedId = $('#hdnSelectedId').val();

            $.ajax({
                url: '<%: Url.Action("SaveComments")%>?id=' + selectedId + '&comments=' + escape(comments),
                type: "post",
                cache: false,
                success: function (savingStatus) {
                    $("#hdnOrigComments").val($('#txtComments').val());
                    $('#lblCommentsNotification').text(savingStatus);
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    $('#lblCommentsNotification').text("Error encountered while saving the comments.");
                }
            });
        });

这里是控制器:

        [HttpPost]
        public ActionResult SaveComments(int id, string comments){
             var actions = new Actions(User.Identity.Name);
             var status = actions.SaveComments(id, comments);
             return Content(status);
        }

我也试过 $('#txtComments').serialize() 代替 escape(cmets) 但还是一样。

【问题讨论】:

  • 我也面临同样的问题!你是怎么解决的?

标签: jquery ajax asp.net-mvc model-view-controller


【解决方案1】:

我不想打开另一个威胁,所以我在这里发布我的问题

Ajax 不会将值转发给控制器,我只是找不到错误:(

-JS

<script>
        $(document).ready(function () {
            $("#sMarka").change(function () {
                var markaId = $(this).val();
                alert(markaId);
                debugger
                $.ajax({
                    type:"POST",
                    url:"@Url.Action("VratiModele")",
                    dataType: "html",
                    data: { "markaId": markaId },
                    success: function (model) {
                        debugger
                        $("#sModel").empty();
                        $("#sModel").append(model);
                    }
                });
            });
        });
    </script>

--控制器

public IActionResult VratiModele(int markaId = 0)
        {
            if (markaId != 0)
            {
                List<Model> listaModela = db.Modeli.Where(m => m.MarkaId == markaId).ToList();
                ViewBag.ModelVozila = new SelectList(listaModela, "ModelId", "Naziv");
            }
            else
            {
                ViewBag.Greska = markaId.ToString();
            }

            return PartialView();
        }

【讨论】:

  • 嗨,请务必解释您的代码的作用/它如何回答问题等。单独的代码 sn-p 可能不足以为所有用户提供信息! :)
  • 抱歉,这个应用程序应该包含两个 Select 标签,当您从第一个 Select 标签中选择诸如“Audi”之类的东西时,第二个应该“放置”Audi 的模型。
  • link 类似这样,我尝试使用他的代码,但它没有工作
  • 您可以编辑您的答案,而不是添加 cmets
【解决方案2】:
[HttpPost]
public ActionResult SaveComments(int id, string comments){
     var actions = new Actions(User.Identity.Name);
     var status = actions.SaveComments(id, comments);
     return Content(status);
}

【讨论】:

    【解决方案3】:
    View Data
    ==============
    
    
     @model IEnumerable<DemoApp.Models.BankInfo>
    <p>
        <b>Search Results</b>
    </p>
    @if (!Model.Any())
    {
        <tr>
            <td colspan="4" style="text-align:center">
                No Bank(s) found
            </td>
        </tr>
    }
    else
    {
        <table class="table">
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Name)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Address)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Postcode)
                </th>
                <th></th>
            </tr>
    
            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Address)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Postcode)
                    </td>
                    <td>
                        <input type="button" class="btn btn-default bankdetails" value="Select" data-id="@item.Id" />
                    </td>
                </tr>
            }
        </table>
    }
    
    
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btnSearch").off("click.search").on("click.search", function () {
                if ($("#SearchBy").val() != '') {
                    $.ajax({
                        url: '/home/searchByName',
                        data: { 'name': $("#SearchBy").val() },
                        dataType: 'html',
                        success: function (data) {
                            $('#dvBanks').html(data);
                        }
                    });
                }
                else {
                    alert('Please enter Bank Name');
                }
            });
    }
    });
    
    
    public ActionResult SearchByName(string name)
            {
                var banks = GetBanksInfo();
                var filteredBanks = banks.Where(x => x.Name.ToLower().Contains(name.ToLower())).ToList();
                return PartialView("_banks", filteredBanks);
            }
    
            /// <summary>
            /// Get List of Banks Basically it should get from Database 
            /// </summary>
            /// <returns></returns>
            private List<BankInfo> GetBanksInfo()
            {
                return new List<BankInfo>
                {
                    new BankInfo {Id = 1, Name = "Bank of America", Address = "1438 Potomoc Avenue, Pittsburge", Postcode = "PA 15220"  },
                    new BankInfo {Id = 2, Name = "Bank of America", Address = "643 River Hwy, Mooresville", Postcode = "NC 28117"  },
                    new BankInfo {Id = 3, Name = "Bank of Barroda", Address = "643 Hyderabad", Postcode = "500061"  },
                    new BankInfo {Id = 4, Name = "State Bank of India", Address = "AsRao Nagar", Postcode = "500061"  },
                    new BankInfo {Id = 5, Name = "ICICI", Address = "AsRao Nagar", Postcode = "500061"  }
                };
            }
    

    【讨论】:

    • 如果您添加一些关于答案的 cmets 会很好!
    【解决方案4】:

    这是执行相同调用的另一种方法。并且您的类型应始终使用大写字母,例如。类型:“GET”/类型:“POST”。

    $.ajax({
          url:/ControllerName/ActionName,
          data: "id=" + Id + "&param2=" + param2,
          type: "GET",
          success: function(data){
                // code here
          },
          error: function(passParams){
               // code here
          }
    });
    

    另一种选择是在链接上使用 data-ajax。

    <a href="/ControllerName/ActionName/" data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#_content">Click Me!</a>
    

    假设你有一个包含 I'd _content 的 div,这将调用该操作并将该 div 内的内容替换为从该操作返回的数据。

    <div id="_content"></div>
    

    并不是对你的问题的直接回答,而是你应该知道的一些信息;)。

    【讨论】:

      【解决方案5】:
      $('#btnSaveComments').click(function () {
          var comments = $('#txtComments').val();
          var selectedId = $('#hdnSelectedId').val();
      
          $.ajax({
              url: '<%: Url.Action("SaveComments")%>',
              data: { 'id' : selectedId, 'comments' : comments },
              type: "post",
              cache: false,
              success: function (savingStatu`enter code here`s) {
                  $("#hdnOrigComments").val($('#txtComments').val());
                  $('#lblCommentsNotification').text(savingStatus);
              },
              error: function (xhr, ajaxOptions, thrownError) {
                  $('#lblCommentsNotification').text("Error encountered while saving the comments.");
              }
          });
      });
      

      【讨论】:

        【解决方案6】:

        尝试使用$.ajax 函数的data 选项。更多信息here.

        $('#btnSaveComments').click(function () {
            var comments = $('#txtComments').val();
            var selectedId = $('#hdnSelectedId').val();
        
            $.ajax({
                url: '<%: Url.Action("SaveComments")%>',
                data: { 'id' : selectedId, 'comments' : comments },
                type: "post",
                cache: false,
                success: function (savingStatus) {
                    $("#hdnOrigComments").val($('#txtComments').val());
                    $('#lblCommentsNotification').text(savingStatus);
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    $('#lblCommentsNotification').text("Error encountered while saving the comments.");
                }
            });
        });
        

        【讨论】:

        • 谢谢!有效。我刚刚将代码修改为 data:{ 'id': selectedId, 'cmets': escape(cmets)} 所以 jquery/ajax 会接受它。
        • @tobias86 我有 30 多个参数,我应该做和你介绍的一样的事情吗?我尝试使用一个对象并使用 JSON.stringify。但是,有时它会给出空值。它间歇性地发生。因此,我们试图消除对象参数并一一发送每个参数,以避免出现间歇性问题。你有什么建议可以更好地解决这个问题吗?谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多