Хорошо, так что ваши варианты в значительной степени поддерживают концепцию прогрессивного улучшения здесь.2 и 3 не будут работать, если ваш клиент не поддерживает java-скрипт.Очевидно, что все в порядке, если вам все равно, но я думаю, что я постараюсь спроектировать вещи так, чтобы они изящно деградировали, а вы просите о наилучшей практике здесь.
Итак, способ, которым я бы это построил, начинается сваш вариант 1. У вас есть кнопки редактирования, которые запускают другое действие, которое загружает страницу редактирования, и эта страница разработана со всеми валидаторами и т. д. в соответствии с обычным mvc.Это ваша базовая функциональность, поэтому она работает без js.
Итак, следующий вопрос: как мы можем постепенно улучшить это, чтобы иметь хорошее всплывающее окно вместо новой страницы?
Что ж, первый шаг -создайте обработчик, чтобы открыть диалоговое окно, прикрепленное к ссылкам редактирования, по щелчку (обязательно e.PreventDefault).Теперь, чтобы сэкономить слишком много усилий по написанию кода, я хотел бы повторно использовать страницу редактирования.Это потребует некоторого рефакторинга, поскольку вы не хотите включать макет для запросов AJAX.Вы можете сделать это несколькими способами, но я думаю, что самое чистое - это иметь область редактирования представления редактирования как частичное представление, которое основное представление редактирования использует для визуализации своей модели.
Затем в действии редактирования, вы можете проверить, есть ли у вас ajax-запрос, если это так, то вернуть PartialView (mypartialeditview) или View (editview), если нет.
С точки зрения последующей отправки результатов на сервер, если вы хотителегкая жизнь, просто относись к ней как к форме.Вы можете использовать micorsoft unobstrive ajax здесь, и это будет очень просто.Вы используете Ajax.BeginForm в вашем частичном представлении.nbЭто ухудшится до нормальной формы, если ajax недоступен.Имейте AjaxOptions для этой beginform, чтобы обновить div в диалоге, поэтому, если он отвечает html, вам больше ничего не нужно делать, это подразумевает ошибку проверки.
[small asideВы спрашивали выше об этом: С точки зрения обработчика HttpPost, связыватель модели модели по умолчанию удивительно умен, он может привязывать поля формы к свойствам параметра объекта сложного класса.Это также работает с json, поэтому вам не нужно заканчивать множеством методов действия для поддержки различных сценариев.]
Так что, если ваше обновление окажется неудачным, обработчик постов снова вернет частичное представление,привязан к модели, так что вы получите все свои валидаторы.Однако, если обновление прошло успешно, я бы предложил вместо того, чтобы что-то возвращать, действие перенаправит вас обратно на вашу главную страницу, которую вы все равно хотите перезагрузить, так как вы изменили базовую версию.
Если вы этого не сделаетекак если бы вы делали полную перезагрузку главной страницы, то она становится более сложной, так как при вышеописанном подходе вы возвращаете html.Вам нужно будет либо выполнить jquery, чтобы найти скрытое поле или класс, чтобы указать на успех / неудачу, либо перейти на чистый подход json, который возвращает jsonresult.Это становится все тяжелее на фронте обслуживания / кодирования.Я, вероятно, сделал бы проверку jquery и связал бы ее с обработчиком завершения ajax.Beginform.
Если вы действительно хотите разобраться с этим, я считаю книгу Steve Sanderson Pro Asp.net MVC бесценной.Тот, который я первоначально прочитал, был для MVC2, но только в процессе чтения обновления MVC3.Я испытываю смешанные чувства по поводу обновления, поскольку в некоторых местах оно было упрощено - теперь легче следить за ним, но я чувствую, что некоторые вещи отсутствуют, к тому же оно было спешно вызвано ошибками и т. Д., Когда оно приближалось к концу.Я думаю, может быть, они запаниковали сейчас, когда говорят о MVC4, а книги не было!Тем не менее, это хорошая книга, и она прекрасно описывает все эти вещи.
Надеюсь, это поможет.Ценю, что он охватывает те же вопросы, что и ответ выше, но надеюсь, что я подробно рассказал вам.