Доступ к данным модели ASP.NET MVC из внешнего файла Javascript - PullRequest
5 голосов
/ 15 ноября 2009

Я пытаюсь использовать $ .getJSON JQuery для доступа к данным модели из контроллера и создать объект JSON в javascript для использования при добавлении и удалении элементов из списка. Все JS делается во внешнем файле. Доступ к серверу для данных модели выполняется только один раз после первой загрузки страницы, поэтому я могу получить полный список опций, из которых пользователь может выбирать. После этого пользователь может изменять список по своему усмотрению (и объект JSON соответствующим образом обновляется), а затем сохранять его (записывается обратно в БД).

Но вот моя проблема: при использовании $ .getJSON, метод, который мне нужно вызвать в контроллере, нуждается в идентификаторе, чтобы он мог посмотреть, о каком конкретном ресурсе я говорю, и получить список параметров, которые относятся к этот конкретный ресурс. Но из внешнего файла JS я не знаю, как получить этот идентификатор для передачи в контроллер. Он встроен в ссылку, которая в первую очередь открывает страницу, и находится в URL, но как только страница загружается, я не знаю, как получить этот идентификатор, чтобы передать его контроллеру. Я вставил часть своего кода ниже, потому что я знаю, что это сбивает с толку:

Метод деталей в Controller, который изначально загружает страницу (для определения того, что загружать, требуется идентификатор ресурса):

public ActionResult Details(string resId)
{
    //call base method
    base.Details(resId, resourceType);
    Evaluation eval = (Evaluation)this.Model;
    ViewData.Model = eval;
    return View("Index");
}

В моем внешнем файле JS я делаю это:

$.getJSON("/Evaluation/PopulateJournalOptions/" + id, populateJSON);

И в Контроллере я написал другой метод, называемый PopulateJournalOptions, который вызывается для создания объекта JSON:

public JsonResult PopulateJournalOptions(string resId)
{
   JournalOptionsResult jsonResult = new JournalOptionsResult();

   base.Details(resId, resourceType);
   Evaluation eval = (Evaluation)this.Model;

   jsonResult.Activities = eval.Journal.Activities;
   jsonResult.Issues = eval.Journal.Issues;
   jsonResult.ScheduledActions = eval.Journal.ScheduledActions;

   return Json(jsonResult);
}

Опять же, моя проблема в том, что после загрузки страницы у меня нет доступа к идентификатору, который необходимо передать в PopulateJournalOptions. Я попытался просто не передавать ничего в PopulateJournalOptions и создавать там новый объект и устанавливать его равным (Evaluation)this.Model, но this.Model, по-видимому, имеет значение null, вероятно, потому что это новый экземпляр Controller после его вызова из JS , Так что я застрял здесь. Есть идеи?

Ответы [ 2 ]

5 голосов
/ 15 ноября 2009

Задумывались ли вы о том, чтобы поместить идентификатор в скрытое поле на странице, а затем сделать так, чтобы ваш javascript прочитал идентификатор из поля?

$.getJSON("/Evaluation/PopulateJournalOptions/" + $('#Id').attr('value'), populateJSON);

Тогда, по вашему мнению,

<%= Html.Hidden("Id") %>

Ваша модель имеет обязательное Id в качестве свойства

0 голосов
/ 15 ноября 2009

Поместите это в контроллер:

ViewData["resouceID"] = resouceID;

Поместите это в представление, которое загружается изначально:

<script>
$(document).ready(function() {
    $.getJSON("<%=Url.Action("YourActionName", "YourControllerName", new {id = ViewData["resouceID"]}) %>", populateJSON);
});
</script>
...