Имейте в виду, что я новичок в том, как MVC, Json, jQuery и т. д. работает, так что потерпите меня. Я занимаюсь веб-формами последние 5 лет ...
Я работаю над проверкой формы в модальном всплывающем окне, которое использует метод JsonResult для отправки данных формы на сервер. Я хотел бы просто загрузить частичное представление в это всплывающее окно и покончить с ним, но это не вариант.
Как бы то ни было, у меня есть код, который вчера работал, но после того, как я сделал pull / push с Git, что-то пошло не так с моей проверкой. Я провожу базовую проверку с помощью обычного JavaScript, прежде чем передать что-либо на сервер (обязательные поля, правильные типы данных и т. Д.), Но некоторые вещи, такие как обеспечение уникальности имени, которое вводит пользователь, требуют, чтобы я прошел весь путь к бизнес-логике.
Покопавшись в Интернете, я обнаружил, что если вы хотите, чтобы jQuery распознавал ошибку из JsonResult в запросе AJAX, вы должны отправить код состояния HTTP, который имеет ошибочный характер. Я почти уверен, что это может быть любое число от 400 до 500, и оно должно работать ... и оно работает ... до определенной степени.
Я бы установил код состояния и описание состояния, используя Response.StatusCode
и Response.StatusDescription
, а затем вернул бы модель.JQuery распознает ошибку, а затем отобразит сообщение об ошибке, которое я установил в описании статуса. Все отлично работало.
Сегодня кажется, что единственное, что связывает мой JsonResult в моем контроллере с моим jQuery, - это код состояния. Я проследил через C #, и, кажется, все настроено правильно, но я просто не могу извлечь это настраиваемое описание состояния, которое я установил.
Вот код, который у меня есть:
Модальное всплывающее окно
<fieldset id="SmtpServer_QueueCreate_Div">
@Form.HiddenID("SMTPServerId")
<div class="editor-label">
@Html.LabelFor(model => model.ServerName)
<br />
<input type="text" class="textfield wide-box" id="ServerName" name="ServerName" title="The display name of the Server" />
<br />
<span id="ServerNameValidation" style="color:Red;" />
</div>
<div class="editor-label">
<span id="GeneralSMTPServerValidation" style="color:Red;" />
</div>
<br />
<p>
<button type="submit" class="button2" onclick="onEmail_SmtpServerQueueCreateSubmit();">
Create SMTP Server</button>
<input id="btnCancelEmail_SmtpServerQueueCreate" type="button" value="Cancel" class="button"
onclick="Email_SmtpServerQueueCreateClose();" />
</p>
</fieldset>
Контроллер
[HttpPost]
public virtual JsonResult _QueueCreate(string serverName)
{
Email_SmtpServerModel model = new Email_SmtpServerModel();
string errorMessage = "";
try
{
Email_SmtpServer dbESS = new Email_SmtpServer(ConnectionString);
model.SMTPServerId = System.Guid.NewGuid();
model.ServerName = serverName;
if (!dbESS.UniqueInsert(model, out errorMessage))
{
return Json(model);
}
}
catch (Exception ex)
{
errorMessage = ex.Message;
}
Response.StatusCode = 500;
Response.StatusDescription = errorMessage;
return Json(model);
}
Запрос jQuery Ajax
$.ajax({
type: 'POST',
data: { ServerName: serverName },
url: getBaseURL() + 'Email_SmtpServer/_QueueCreate/',
success: function (data) { onSuccess(data); },
error: function (xhr, status, error) {
$('#GeneralSMTPServerValidation').html(error);
}
});
Как я уже упоминал, вчера он показывал пользователю приятное сообщение, информирующее его о том, что Введенное ими имя не было уникальным, если оно существовало. Теперь все, что я получаю, это сообщение «Internal Server Error» ... что правильно, так как это то, что я отправляю вместе с собой, когда устанавливаю свой код состояния. Однако, как я уже упоминал, он больше не видит отправляемое мной настраиваемое описание статуса.
Я также пробовал установить для него какой-то неиспользуемый код состояния, чтобы увидеть, была ли это проблема, но он просто ничего не показывает, потому что не знает, какой текст отображать.
Кто знает? Может, сейчас что-то не так с моим кодом. Скорее всего, это было изменение, сделанное где-то еще, что это могло быть, я понятия не имею. Есть ли у кого-нибудь идеи о том, что может пойти не так?
Если вам понадобится еще код, я постараюсь его предоставить.
Спасибо!