#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-адреса без крайней необходимости.