ASP.NET Проблема с MVC3 Jquery / Ajax

#jquery #asp.net #ajax #asp.net-mvc-3

#jquery #asp.net #ajax #asp.net-mvc-3

Вопрос:

С ASP.NET MVC3 Я использую Jquery / Ajax для отправки данных из формы в функцию в моем контроллере. Проблема, с которой я сталкиваюсь, заключается в том, что когда я помещаю этот код в свое представление индекса, он работает нормально, но когда я помещаю тот же код в свое представление CreatePost, у меня не работает. Я могу определить, работает он или нет, основываясь на предупреждении и установив точку останова для функции в контроллере.

Мой контроллер называется BlogController, и вот как выглядит функция: (на данный момент это фиктивная функция)

     [AcceptVerbs(HttpVerbs.Post)]
    public JsonResult CreateEntry(string title, string body)
    {
        return Json(false);
    }
  

Код, на мой взгляд, выглядит следующим образом:

 <script type="text/javascript">
$(function () {
    $(".error").hide();

});

function SubmitEntryPostForm() {
    var blogEntry = {
        'title': $('#EntryTitle').val(),
        'body': $('#EntryBody').val()
    };
    $.ajax({
        type: "POST",
        url: "blog/CreateEntry",
        data: blogEntry,
        success: function () {
            alert("it worked");
        }

    });
    return false;
}

function ValidateCreateEntry() {
    $(".error").hide();
    var title = $("#EntryTitle").val();
    if (title == "") {
        $("#title_error").show();
        $("#EntryTitle").focus();
        return false;
    }
    var body = $("#EntryBody").val();
    if (body == "") {
        $("#body_error").show();
        $("#BodyTitle").focus();
        return false;
    }
    return SubmitEntryPostForm();
}
  

 <div id="CreateEntry">
<form action="">
    <fieldset>
        <label for="title" id="title_label">Title</label>
        <input type="text" name="title" id="EntryTitle" size="30" />
        <label class="error" for="title" id="title_error">This field is required.</label>
        <br />
        <label for="body" id="body_label">Content</label>
        <input type="text" name="body" id="EntryBody" size="30" />
        <label class="error" for="boby" id="body_error">This field is required.</label>
        <br />
        <input type="submit" name="submit" class="button" id="CreateEntryButton" value="Send" onclick="return ValidateCreateEntry();" />
    </fieldset>
</form>
  

Комментарии:

1. как CreatePost это выглядит?

2. Вы получаете какие-либо ошибки в консоли? Каков ответ?

3. Индексирование и создание Post идентичны в том смысле, что они оба содержат javascript и одинаковую форму.

4. Возможно, источник вашей проблемы — Daniel: createEntry != CreatePost. Верны ли ваши маршруты в вашем глобальном.asax?

5. Я нашел проблему. Рори был прав, проверив консоль. Я некоторое время не использовал firebug и просто использовал вкладку script без какого-либо успеха. Проблема в том, что javascript должен вызывать «createEntry» в представлении CreatePost, а не «blog / createEntry», результатом является Blog / blog / createEntry, что неверно.

Ответ №1:

У вас, вероятно, есть actions Index и createEntry в вашем BlogController правильно, и, вероятно, это контроллер по умолчанию? Если это так, то при вызове действия CreatePost ваш URL в браузере будет выглядеть

localhost/blog/CreatePost

и когда вы вызываете действие Index, ваш URL в браузере выглядит как

localhost/блог/

(поскольку вы явно не записываете / не индексируете). Итак, в первом случае, относительный URL ajax в коде javascript

url: «blog/createEntry»

публикуется в

localhost/blog/блог/createEntry/

в то время как второй вызывает

localhost/blog/createEntry/

и вот почему это работает. Итак, вам нужно использовать абсолютные URL-адреса в ваших вызовах AJAX с помощью какой-либо функции, такой как Url.Content, VirtualPathUtility.До абсолютного и т.д. Эмпирическое правило: никогда не используйте относительные URL-адреса без крайней необходимости.