Я искал способ обновить данные с помощью модального всплывающего окна. Сейчас я использую devexpress, потому что мы уже используем другие элементы управления devexpress (но это может измениться, если jquery библиотека была бы проще!!)
Я застрял с аспектом проверки. Честно говоря, весь процесс кажется довольно сложным для того, чего я пытаюсь достичь.
В любом случае, позвольте мне описать процесс, который я сейчас разработал:
– Страница индекса содержит обзор различных элементов, которые можно обновить. Используя HtmlExtension, я смог создать всплывающее окно devexpress, которое загружает страницу редактирования при открытии всплывающего окна. => @Html.PopupControl().WithText("Редактировать").PopupGoesTo(Url.Action("EditPopup" и т.д.)
- Страница редактирования, которая является лишь частичным представлением, работает просто отлично. Я создал небольшую тестовую страницу, содержащую 1 текстовое поле, которое принимает десятичные дроби.
Я хочу отправить форму с помощью ajax (потому что, честно говоря, я понятия не имею, как я могу показать проверку, если я сделаю полный пост, так как мне нужно иметь возможность создать всплывающее окно и привязать к нему данные И запустить проверку ошибки).
<script type="text/javascript">
function EndPopUpUpdate(message) {
if (message.url) {
window.locatin.href = url;
}
$("#submitButtonPopUp, #loadingPopUp").toggle();
}
function BeginPopUpUpdate() {
$("#submitButtonPopUp, #loadingPopUp").toggle();
}
</script>
using (Ajax.BeginForm("Edit", "xxx", new AjaxOptions { UpdateTargetId = "PopUpDiv", HttpMethod = "Post", OnBegin = "BeginPopUpUpdate", OnComplete = "EndPopUpUpdate"}, new { id = "PopUpForm" }))
{
<div id="PopUpDiv">
@Html.Partial("EditPopup", new xxxViewModel())
</div>
}
Мне удалось добиться проверки, когда я выполняю обратную передачу, вручную перехватывая события jquery (потому что они не перехватываются, поскольку страница загружается динамически)
function ReconnectValidation() {
$("#PopUpForm").ready(function () {
$.validator.unobtrusive.parse("#PopUpForm");
});
$("#submitButton").click(function (e) {
var form = $("#PopUpForm");
if (!form.valid()) {
e.preventDefault();
}
});
}
Так что это обрабатывает мою проверку на стороне клиента, которая работает.
Теперь, моя актуальная проблема! Проверка на стороне сервера.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([ModelBinder(typeof(CommandModelBinder))] UpdateCommand command)
{
if (!ModelState.IsValid)
{
//using the command pattern
var handlerResult = HandlerLocator.GetQueryHandler<IGetOverviewHandler>().Execute(..);
return PartialView("EditPopUp", handlerResult.ViewModel);
}
HandlerLocator.GetCommandHandler<UpdateCommand>().Handle(command);
var returnLink = Url.Action("Index", new {..});
return Json(new { url = returnLink }, JsonRequestBehavior.AllowGet);
}
Я написал CustomModelBinder, который ничего не делает, кроме как ищет свойства в моем объекте команды (моя возвращаемая модель, если хотите) и ищет в коллекции форм, может ли он найти соответствующий объект с тем же именем. Затем он пытается преобразовать его и привязывает ModelError к моему ModelState, если это не удается.
Итак, теперь у нас есть ModelState, который либо действителен, либо недействителен. Если это действительно так, я хочу перенаправить на индекс (чтобы мой обзор мог обновляться). Я читал, что должен обрабатывать это на стороне клиента, потому что ajax.BeginForm собирается заменить "PopUpDiv" -div результатом (который просто создает ту же страницу на моей странице).
Вот событие onComplete:
function EndPopUpUpdate(message) {
if (message.url) {
window.locatin.href = url;
}
$("#submitButtonPopUp, #loadingPopUp").toggle();
}
Проблема в том, что я не получаю сообщение json, но получаю PartialView. Это означает, что я не могу получить доступ к message.url..потому что это не то, что я получаю :/
Итак, проблема номер 1
Если объект недействителен, я хочу вернуть частичное представление с моделью и выдать пользователю ошибку. Когда я возвращаю частичное представление, оно просто заменяет текущее представление, но не показывает никаких ошибок проверки..
Это проблема №2 :)
Кроме того, если вы знаете лучший способ решить эту проблему, пожалуйста, не стесняйтесь ответить (потому что этот метод кажется действительно запутанным для того, что он делает или должен делать)
Извините за длинное сообщение, но надеюсь все понятно.
Спасибо за вашу помощь и время!