Asp.Net MVC Ajax и аспекты загрузки страницы (Просмотр) - PullRequest
0 голосов
/ 13 октября 2009

У меня сейчас работает отличное приложение MVC, и я добавляю некоторые функции AJax. У меня есть таблица, которая отображает 10 элементов, только определенные пользователи могут видеть определенные элементы. Когда пользователь добавляет новое сообщение, я настраивал ajax для сохранения нового сообщения.

Однако затем мне нужно обновить таблицу, я не могу узнать из JQuery, в каком состоянии находится пользователь (и, следовательно, что он может видеть), поэтому я не могу просто вставить новую строку (поскольку некоторые пользователи не могут видеть эту строку). Если бы это были веб-формы, у меня также была бы страница с дампом таблицы, а затем я бы использовал JQuery для загрузки содержимого этой урезанной «страницы» в соответствующий слот на текущей странице.

Какой лучший способ добиться этого с MVC?

Спасибо

Ответы [ 4 ]

1 голос
/ 13 октября 2009

Как подсказывает @Robert Koritnik, лучший способ справиться с этим - использовать PartialView. Я предложил бы иметь два отдельных действия контроллера - одно, которое обрабатывает исходный запрос, и другое, которое обрабатывает новую запись AJAX. Оба действия вызвали бы одну и ту же логику для получения данных для таблицы. Первый будет помещать данные в модель представления вместе с другими данными страницы. Последний будет упаковывать данные в модель для частичного просмотра.

Модельные классы

public class PageViewModel
{
    ....
    public IEnumerable<TableViewModel> TableData { get; set; }
}

public class TableViewModel
{
    ...
}

Код контроллера

[AcceptVerbs( HttpVerbs.Get )]
public ActionResult Index()
{
    var model = new PageViewModel();
    model.TableData = GetTableForUser( this.User );

    return View( model );
}

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult AddEntry( ... )
{
    ...  add the new entry ...
    var model = GetTableForUser( this.User );

    return PartialView( "TableView", model );
}


private TableViewModel GetTableForUser( IIdentity user )
{
  ...
}

Посмотреть код

Главный вид

<% Html.RenderPartial( "TableView", model.TableData ); %>

<script type="text/javascript">
    $('#entryForm').submit( function() {
        $.post( '<%= Url.Action( "addentry", "controller" ) %>',
                $('#entryForm').serialize(),
                function(data) {
                   $('#table').replaceWith( data );
                },
                'html' );
        return false;
    });
</script>

TableView

<table id="table">
<% foreach (var row in Model) { %>
    <tr>
     ...
    </tr>
<% } %>
</table>
1 голос
/ 13 октября 2009

Используйте PartialView функциональность, которая будет возвращать только <table>, что вам нужно. На вашей главной странице он будет включен, но при вызове Ajax он будет отправлять только HTML обратно клиенту, который вы можете использовать для замены существующего элемента <table>.

0 голосов
/ 13 октября 2009

Нетрудно добавить cookie, в котором будет храниться текущее состояние пользователя, или вы можете просто добавить еще один вызов Ajax, чтобы узнать, авторизован пользователь или нет. вы просто создаете некоторые элементы в вашем контроллере для обработки всех ситуаций: авторизован ли пользователь или нет, что вы показываете / скрываете от них.

что именно тебе нужно?

0 голосов
/ 13 октября 2009

Если я вас правильно понимаю, вы говорите, что пользователь A просматривает список записей, а пользователь B (в какой-то другой части света. Возможно) публикует новую запись. Вы хотите, чтобы список на экране пользователя A обновлялся, но только если новая запись является той, которую пользователь A может видеть?

Если это так, вы можете запустить таймер на странице и, когда таймер сработает, он вызывает AJAX-вызов на сервер, спрашивая, есть ли какие-либо новые записи для пользователя. Идентификационные данные пользователя и, следовательно, какие элементы они могут видеть, должны быть определены из сеанса (как именно это работает, зависит от вашей конкретной архитектуры, но я думаю, что вы уже делаете это, чтобы отобразить список пункты для пользователя А, с чего начать)

Здесь можно рассмотреть все мелкие детали ...

  1. Как часто должен срабатывать таймер, чтобы своевременно получать обновления, но не вызывать слишком большой трафик на сервер
  2. Если вы просто обновите весь список (это делает код простым) или если вы будете загружать только новые элементы (Это усложнит логику, но при этом уменьшит трафик)
  3. Как убедиться, что вы правильно определили пользователя и правильно отфильтровали записи, чтобы показать только соответствующие.

Это относительно простой сценарий - и он не слишком редкий - но к нему нужно подходить разумно, чтобы не допустить возникновения осложнений.

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