MVC3, переключение между режимами просмотра на одной странице - PullRequest
1 голос
/ 24 ноября 2011

Я работаю над проектом MVC, который должен иметь только одну страницу с двумя зонами. В одной зоне у меня есть Google Map с маркерами, а вторая зона заполнена данными выбранного маркера.

В представлении details есть кнопка, которая при щелчке должна перевести все представление в режим edit без обновления страницы или ее перенаправления. Я использовал два вида: для подробностей и для редактирования и с помощью функции ajaxForm я переключаюсь между этими двумя видами. Я добавляю ajaxForm в documentready для edit view.

<script type="text/javascript"> 
    // wait for the DOM to be loaded 
    $(document).ready(function() { 
        // bind 'myForm' and provide a simple callback function 
        $('#currentDiv').ajaxForm(function(data) { 
            $('#currentDiv').html(data);
        }); 
    }); 
</script> 

Проблема возникает, когда на стороне сервера появляется ошибка при попытке сохранить данные из редактировать вид, и я хочу вернуться к тому же редактировать вид с отображенными ошибками. Обработчик ajaxForm больше не добавляется, и даже если новые значения, которые будут пытаться сохранить, в порядке, представление detail загружается на другую страницу.

К сожалению, использование ajaxForm создает некоторые другие проблемы, потому что у меня нет контроля над случаями, когда вызов ajax терпит неудачу.

Есть идеи, как мне это исправить? Это какое-то другое решение для переключения между этими двумя представлениями без использования ajaxForm и без обновления страницы?

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Я начал отходить от представлений asp.net, доступных в ASP.Net MVC, из-за некоторых несовместимостей и / или ненужных сложностей при попытке достичь функциональных возможностей, ожидаемых от сайтов с поддержкой AJAX того времени.

Я бы порекомендовал перейти к дизайну, где вы используете «тупые» HTML-файлы, используете jQuery для загрузки их с помощью AJAX и помещаете их в контейнер (лично я использую div), а затем используйте другой вызов AJAX для сбора данных из контроллера.У этого подхода есть ряд преимуществ:

  1. Он устанавливает реальное (не поддельное) разделение между кодом на стороне клиента и на стороне сервера.
  2. HTML-файлы могут кэшироваться на клиентесокращение объема передаваемых данных.
  3. Связывание элементов Html становится задачей на стороне клиента, достигаемой с помощью циклов обработки разгрузки jQuery с сервера.
  4. Контроллеры по сути становятся коллекциями веб-методов, что означаетони могут быть реализованы приложениями для iPhone и Android, что облегчает развертывание на мобильных устройствах.

Я понимаю, что, возможно, это не точный ответ, который вы ищете, и это может быть не вариант для вас, но я надеюсь,заключается в том, что это поможет кому-то в какой-то момент принять решение отказаться от смешивания HTML-кода и кода на стороне сервера.

1 голос
/ 24 ноября 2011

Я думаю, что есть несколько разных вопросов, которые вы задаете.

Во-первых, вы добавляете обработчики jquery, чтобы иметь дело со случаем, когда вы получаете ошибку типа 500 с сервера.

Что-то вроде следующего.Я предлагаю взглянуть на документы для получения дополнительной информации.

$(document).ajaxError(function(event,jqXHR,ajaxSettings,thrownError){
   if (jqXHR.status != 0){
         window.location = <error page>
    }
}

Вторая проблема, кажется, связана с обработкой ошибок известных ошибок (скажем, неверный ввод).В этом случае я предлагаю следующий рабочий процесс.

1) Пользователь нажимает на кнопку редактирования, взятую для редактирования экрана 2) Пользователь вводит данные, использует проверку на стороне клиента, чтобы выполнить первоначальную проверку 3) Пользователь передает, пользователь затемвыводится на экран просмотра и отображается сообщение об успехе или ошибке.

Ответ сервера может выглядеть следующим образом:

public ActionResult Edit(EditModel model){
   if (!ModelState.IsValid)
   {
     return Json(new {successful = false, message = "Failed.."});
   }
   ...
}

На стороне клиента обратный вызов формы теперь должен обрабатывать сообщение ифакт был успешным или нет.В моей реализации я использовал knockoutjs для создания области «сообщения», которую я мог бы обновить и очистить.(Я создал шаблоны и т. Д.).

Не забудьте использовать проверку на стороне клиента для простой проверки полей .... Это сохранит поездку обратно на сервер.

Ваш может быть вполнепросто, выскакивая сообщение, возвращаемое с сервера.

Наконец, готовый документ запускается только после завершения загрузки исходного документа, и никогда больше для вызова ajax (по крайней мере, в моем понимании).Просто поместите этот код, который является document.ready в нижней части страницы редактирования.Он будет срабатывать после того, как HTML, на который он нацелен, уже отрендерен.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...