【问题标题】:Posting AJAX string to MVC Controller将 AJAX 字符串发布到 MVC 控制器
【发布时间】:2019-03-19 14:09:49
【问题描述】:

我正在尝试使用 AJAX 将字符串(用户单击的 href 的名称)发布到我的 MVC 控制器(然后它将用于根据字符串过滤我的表格结果)。

虽然我已经设法让它在 AJAX 端发布(至少根据警报),但它似乎没有正确到达控制器端,并且在我的快速错误捕获中被视为 null( if 语句)。

请暂时原谅无用的命名约定。我已经尝试了无数方法来尝试解决这个问题,所以当我找到合适的解决方案时会正确命名:)。

我已经为此工作了很长时间,但似乎无法解决这个难题,所以请提供任何帮助!一般来说,我对 AJAX 和 MVC 很陌生,所以我希望这是一个小错误。 :)(仅供参考,我已经尝试过 post 和 get 并且似乎都产生了相同的结果?)

控制器:

[Authorize]
    [HttpGet]
    public ActionResult GetSafeItems(string yarp)
    {
        using (CBREntities2 dc = new CBREntities2())
        {
            if (yarp == null)
            {
                ViewBag.safeselected = yarp;
            }
            var safeItem = dc.Items.Where(a => a.Safe_ID == yarp).Select(s => new {
                Serial_Number = s.Serial_Number,
                Safe_ID = s.Safe_ID,
                Date_of_Entry = s.Date_of_Entry,
                Title_subject = s.Title_subject,
                Document_Type = s.Document_Type,
                Sender_of_Originator = s.Sender_of_Originator,
                Reference_Number = s.Reference_Number,
                Protective_Marking = s.Protective_Marking,
                Number_recieved_produced = s.Number_recieved_produced,
                copy_number = s.copy_number,
                Status = s.Status,
                Same_day_Loan = s.Same_day_Loan
            }).ToList();

        //    var safeItems = dc.Items.Where(a => a.Safe_ID).Select(s => new { Safe_ID = s.Safe_ID, Department_ID = s.Department_ID, User_ID = s.User_ID }).ToList();
            return Json(new { data = safeItem }, JsonRequestBehavior.AllowGet);
        }
    }

AJAX 功能(在查看页面上):

$('.tablecontainer').on('click', 'a.safeLink', function (e) {
            e.preventDefault();
            var yarp = $(this).attr('safesel');
            var selectedSafeZZ = JSON.stringify("SEC-1000");
            $.ajax({
                url: '/Home/GetSafeItems',
                data: { 'yarp': JSON.stringify(yarp) },
                type: "GET",
                success: function (data) {
                    alert(yarp);
                    console.log("We WIN " + data)
                },
                error: function (xhr) {
                    alert("Boohooo");
                }
            });

        })

** 警报显示正确的类型:“SEC-1000” 但是控制台Log显示:WE WIN [Object object]??

【问题讨论】:

  • 试试console.log("We WIN " + JSON.stringify(data)) - 这是一个对象
  • 嗨史蒂夫,它返回以下结果:We WIN {"data":[]} ...我猜这表明 DATA 为空但 yarp 没问题??
  • 是的,[] 是一个空数组 - 所以没有返回任何内容。如果它是一个数组,你可以做if(data.length > 0) { ... 然后为每个元素做一个。
  • 它应该只发布一个字符串“SEC-1000”供我的控制器方法拾取和使用。所以不知道为什么它会以数组的形式出现?
  • 一旦你做错了data: { 'yarp': JSON.stringify(yarp) }, - yarp 是一个字符串(不是 JSON 对象)。此外,您还获得了 List()safeItem 并将其发回,所以这是正确的 - 它是一个数组。

标签: c# ajax asp.net-mvc


【解决方案1】:

我在一个新的 mvc 虚拟项目中尝试了一些基本的东西:

查看页面基本文本框和一个按钮:

<input type="text" id="txt_test" value="test"/>
<button type="button" class="btn" onclick="test()">Test</button>

<script type="text/javascript">
        function test()
        {
            var text = $("#txt_test")[0].value;

            $.ajax({
            url: '@Url.RouteUrl(new{ action="GetSafeItems", controller="Home"})',
            // edit 
            // data: {yarp: JSON.stringify(text)},
            data: {yarp: text},
            type: 'GET',
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            success: function(data) {
                // edit 
                // alert(JSON.stringify(data));
                alert(data.data);
            }});
        }           
</script>

控制器:

[HttpGet]
public ActionResult GetSafeItems(string yarp)
{
        return Json(new {data = string.Format("Back end return : {0}",yarp)}
        , JsonRequestBehavior.AllowGet);
}

警报结果 => {"data":"后端返回:\"test\""}

这是对 Web 方法的简单 ajax 调用。你不返回视图,所以我不明白使用

if (yarp == null)
{
    ViewBag.safeselected = yarp;
}

我还看到一个 [Authorize] 属性,您可能使用了一些身份验证,而我在您的 ajax 调用中没有看到任何身份验证标头

【讨论】:

  • 这真是太棒了,谢谢!它现在已将其发布到服务器,我的警报结果与您的类似。虽然我的不是文本框,而是来自一种 href,所以我使用了:var text = $(this).attr('safesel ');但仍然可以正常工作...但是,有没有办法将数据缩减为仅实际文本?例如......我的输入是“SEC-1000”,但数据作为 {"data":"\"SEC-1000\""} 发送,这意味着它绕过我的控制器 if 语句在技术上不是“SEC-1000” "。
  • 至于最后一点,if 语句只是浪费代码,允许我在其中放置故障排除点,所以是的,一旦解决了就不会存在。至于授权,它是 ASP.NET MVC 安全性的一部分,所以据我所知,这不会引起任何问题:)
  • 实际上,由于您只处理文本,因此您可以摆脱 JSON.stringify 转换: data: {yarp: JSON.stringify(text)} => data: {yarp: text} 并在成功回调:警报(JSON.stringify(数据)); => 警报(data.data);
  • 老实说,你是一个绝对的救星!!谢谢你!现在一切正常,我可以继续前进!正如我所说,对此非常陌生,并且必须将其作为项目的一部分进行工作,非常感谢您的帮助......我现在可以放松一点!
【解决方案2】:

试试这个:

$.each(data, function (i) { console.log("We WIN " + data[i].Serial_Number )});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2021-11-07
    • 2023-03-13
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多