ASP MVC 3 HTTP Post через JQuery постоянно возвращает 500. URL и контроллер совпадают - PullRequest
2 голосов
/ 17 апреля 2011

У меня есть ссылка действия, по которой я хочу отправить сообщение HTTP на мой контроллер, однако я продолжаю получать HTTP 500.

Вот мой jQuery

<script type="text/javascript">

    $(document).ready(function () {
        $('.thing').click(function (e) {
            e.preventDefault();
            $.ajax({
                url: this.href,
                dataType: "json",
                type: "POST",
                success: function (data) {
                    if (data.Success == true) {
                       // do something
                    }
                    else {
                        alert(data.Message);
                    }
                },
                error: function (textStatus, errorThrown) {
                    // request always errors
                }
            });
        });
    });    
</script>

и мойКод ссылки действия

@Html.ActionLink("my link", "DoStuff", "Dude", new { thingId = item.Id }, new { @class = "thing" })

Мой контроллер

public class DudeController : Controller
{
    [HttpPost]
    public ActionResult DoStuff(int thingId)
    {
        return Json(new { Success = true, Message = string.Empty }, JsonRequestBehavior.AllowGet);
    }

}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

Для тех, кто сталкивается с этой проблемой, вот еще один потенциальный интерес. В моем контроллере у меня было следующее:

    var events = (from e in db.EventMsts                                                      
    where e.Eventid.Equals(eventID)
    orderby e.EventNm
    select new { e.Eventid, e.EventNm, e.EventDescription, e.URLEventSite, e.URLTicketSales,e.EventDates  })
                                    .Take(1)
                                    .ToArray();
    return Json(events);

Который не выдавал никаких исключений, и тогда браузер получал бы HTTP 500.

e.EventDates - это коллекция объектов, в то время как остальные были строками / целыми числами. Простое удаление e.eventDates из контроллера (и запроса ajax) позволило добиться успеха (за исключением пропуска данных, которые я хочу).

Согласно ответу Крэйга, существуют ограничения безопасности, которые не позволяют передавать подобные аргументы (Крейг, я просто доверяю вам в этом, поскольку на самом деле я не видел документа по этому поводу). Решение состояло в том, чтобы развернуть мой объект EventDates до одной строки с разделителями, чтобы я мог проанализировать его в jQuery. Вот то, что мой код стал и теперь работает для меня - обратите внимание, что у события есть Даты события, а у даты события есть время события.

    var dateTimeList = new StringBuilder();

    var times = (from t in db.EventTimes
          where t.EventDate.Eventid.Equals(eventID)
                             orderby t.EventStartTm
                             select
                                new {
                                        t.EventDate.EventDt,
                                        t.EventStartTm,
                                        t.EventEndTm}).ToArray();
    foreach (var time in times)
    {
        if (dateTimeList.Length > 0)
        {
            dateTimeList.Append("|" + time.EventDt + " from " + time.EventStartTm + " to " + time.EventEndTm ?? "whenever");
        }
        else
        {
            dateTimeList.Append(time.EventDt + " from " + time.EventStartTm + " to " + time.EventEndTm ?? "whenever");
        }
    }
    var dateTimeString = dateTimeList.ToString();
    var evnt = (from e in db.EventMsts
                where e.Eventid.Equals(eventID)
                orderby e.EventNm
        select new { e.Eventid, e.EventNm, e.EventDescription, e.URLEventSite, e.URLTicketSales, dateTimeString })
        .FirstOrDefault();

    return Json(evnt);
0 голосов
/ 18 апреля 2011

Можете ли вы попробовать удалить dateType из вызова ajax и добавить данные? Для меня это работает:

$(document).ready(function () {
$('.thing').click(function (e) {
    e.preventDefault();
    $.ajax({
        url: this.href,
        type: "POST",
        data: this.thingId,
        success: function (data) {
            if (data.Success == true) {
                // do something
                alert(data.Message);
            }
            else {
                alert(data.Message);
            }
        },
        error: function (textStatus, errorThrown) {
            // request always errors
        }
    });
});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...