Обновление модели с точки зрения - PullRequest
0 голосов
/ 27 марта 2012

Я не уверен, как обновить мою модель представления в MVC3. То, что я пытаюсь сделать при нажатии кнопки, выполнить поиск по моей модели представления для определенного элемента списка. Пример:

BooksViewModel

public List<Book> Books{get;set;}

На мой взгляд, когда пользователь нажимает на кнопку, мне нужно искать список в ViewModel следующим образом:

Controller
public void SetContent(int chapterId, int paragraphId)
{
  var paragraph = booksViewModel.Books.Where(b =>b.ChapterId == chapterId).First().Chapter.Paragraphs.Where(p => p.Id == paragraphId).First()
  model.CurrentParagraph = paragraph;
}

Проблема, с которой я столкнулся, заключается в том, что я не могу получить доступ к экземпляру BooksViewModel из контроллера. Как получить доступ к экземпляру модели представления, которая использует представление, в котором уже есть данные, полученные из базы данных? Или я все это делаю неправильно?

Заранее спасибо

1012 * редактировать *

Максим предложил передать мою модель из представления во вторичный вызов к контроллеру (т.е. для фильтрации модели)

я бы сделал это, используя ключевое слово @Model, например:

$.ajax({
            type: "POST",
            url: "/Books/SetSelectedContent?id=" + id + "&paragraphId="+paragraphId+"&model="+@Model, // the URL of the controller action method
            data: null, // optional data
            success: function(result) {

            },
            error: function(req, status, error) {
                alert('error' + error);
            }
        });

Когда я пытался это сделать, казалось, что вызов ajax задохнулся от @ Model

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Помните, что сеть и просмотры не имеют состояния.Как только действие выполнено, оно исчезает (если вы не используете сеанс, но это другой зверь).

Если вы хотите выполнить поиск в списке после того, как он был передан в представление, в другом действии контроллера (новый запрос пропал, все из предыдущего запроса пропало), вам придется заново создать список.

public MyController
{
    public ActionResult Index()
    {
        var books = _service.GetBooks();
        return View(new BooksViewModel
        {
            Books = books
        });
    }

    // Once the button is clicked, it routes to this action:
    [HttpPost]
    public ActionResult SetSelectedContent(int paragraphId)
    {
        // Here you search for the specific paragraph that you want.
        // Ideally this goes in a service call, but here to illustrate.
        // The linq query won't materialize every book, but will give an
        // optimized query that only gives the paragraph that you want.
        // Depending on your model structure, this will work better.

        // Paragraph Id's should be unique, yes? so no need for the chapter
        // then.
        var paragraph = database.Paragraphs
            .Single(p => p.paragraphId == paragraphId);

        // Note the 'Content' here, not View.  This will return just the
        // plain text to be replaced by ajax.
        return Content(paragraph);
    }
}

Вот исправление для этого примера ajax:

$.ajax({
        type: "POST",
        url: "/Books/SetSelectedContent",

        // populate the data with whatever the chapter and paragraph id should be.
        data: { pargraphId: @paragraphId }
        success: function(result) {
            // Here you do something with the result.
            // This would just replace a specific div with the contents
            // of the searched paragraph.
            $('#DivToReplace').html(result);
        },
        error: function(req, status, error) {
            alert('error' + error);
        }
    });

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

0 голосов
/ 27 марта 2012

Когда вы отправляете View в браузер пользователя, вы создаете экземпляр вашей Модели (в вашем случае вы называете его ViewModel).Это делается как часть некоторого действия, которое возвращает представление в вашем контроллере.Если вы хотите, чтобы измененная версия вашей Модели была реконструирована для Action-procession, вам следует запросить ее в качестве параметра в подписи вашего Action в случае отправки формы POST, либо вы просто создаете новую модель и инициализируете представление с ней.,

Из того, что я вижу, это тот случай.Просто создайте новый BooksViewModel, выполните фильтрацию и отправьте View(myFilteredModel) пользователю.

Но вы также можете попробовать это:

[HttpPost]    
public void SetContent(int chapterId, int paragraphId, BooksViewModel booksViewModel)
    {
      var paragraph = booksViewModel.Books.Where(b =>b.ChapterId == chapterId).First().Chapter.Paragraphs.Where(p => p.Id == paragraphId).First()
      model.CurrentParagraph = paragraph;
    }

Что касается доступа к БД для каждого действиявыполнение - это решается путем реализации механизма кэширования.

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