2013-06-03 5 views
0

Из-за странности в моем вопросе я подозреваю, что не пойду в правильном направлении.Как правильно вызвать метод JsonResult в контроллере из модели просмотра?

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

public class FooListViewModel 
{ 
    public FooListViewModel() 
    { 
     DateTime today = DateTime.Today; 
     DateTime later = DateTime.Today.AddDays(5); 

     // Here I need to make call to my JsonResult method 
     // in the controller to populate fooItems 
    } 

    public IEnumerable<FooItem> fooItems { get; private set; } 
    public IEnumerable<DateTime> dates { get; private set; } 

} 

В контроллере

[HttpGet] 
public JsonResult GetItems(DateTime start, DateTime end) 
{ 
    var fooItems = domainServices.Foo.GetAllFooItems(); 

    // Add predicates to filter between start and end dates. 

    return Json(fooItems, JsonRequestBehavior.AllowGet); 
} 

На каждой кнопке страницы мыши, она будет перезагружать только список с другим вызовом метода JsonResult в контроллер через AJAX, но это уже сделано.

+2

Вместо того, чтобы пытаться описать, что делает ваш код, вы получите лучшую помощь, если сможете опубликовать небольшой полный пример, который воспроизводит проблему. Поскольку он стоит прямо сейчас, я не уверен, каков ваш вопрос/проблема. – cadrell0

+0

Достаточно честный. Я добавил несколько примеров кода, но мой вопрос находится в названии. – Josh

+0

Ах. есть ли причина, по которой вы просто не называете ваши вызовы нажатием кнопки, когда страница загружается с javascript? –

ответ

2

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

В противном случае создайте функцию GetData, которую вызовет ваша программа контроллера (Index?), И ваши обычные вызовы GetJSON, чтобы получить нужные данные. Метод index будет придерживаться этого в модели, чтобы перейти к представлению, и процедура GetJSON просто возвращает результат как json.

Пример кода:

public ActionResult Index() 
{ 
    MyViewModel model = new MyViewModel(); 
    model.data = GetData(); 
    return View(model); 
} 

public JsonResult GetJson(DateTime startDate,DateTime endDate) 
{ 
    var result=GetData(startDate,endDate); 
    return Json(result); 
} 

private IEnumerable<MyData> GetData(DateTime startDate=null,DateTime endDate=null) 
{ 
    return something; 
} 
+0

Извините, я не был чист. Моя проблема, с которой я борюсь, - в модели.Я хочу вызвать метод JsonResult * в * модели для анализа начальной загрузки. – Josh

+0

Обновленный ответ теперь, когда я понимаю вопрос лучше. –

+0

Это хороший момент, Роберт. Довольно очевидно. Я думаю, это должно быть так, как я это сделаю. – Josh

1

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

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

public class FooProvider 
{ 
    public List<Foo> GetFilteredFoos (/* whatever you need */) 
    { 
     // filter and return foos 
    } 
} 

контроллер:

public JsonResult GetItems(DateTime start, DateTime end) 
{ 
    var fooItems = domainServices.Foo.GetFilteredFoos(/* some params */); 
    return Json(fooItems); 
} 

Модель:

public FooListViewModel() 
{ 
    DateTime today = DateTime.Today; 
    DateTime later = DateTime.Today.AddDays(5); 

    var ds = DomainServices(); 
    fooItems = ds.Foo.GetFilteredFoos(/* some params */); 
} 

Здесь я предполагаю, что DomainServices.Foo является экземпляром класса под названием FooProvider.

Сказав это, однако, я мог бы избежать такого типа входа в вашу модель просмотра вообще, где это возможно. Почему бы просто не сделать вызов в контроллере при первой инициализации модели?

public ActionResult Index() 
{ 
    var model = FooListViewModel(); 
    model.fooItems = ds.Foo.GetFilteredFoos(/* things */); 
    return View(model); 
} 

Затем, обновив через AJAX как обычно.

+0

Итак, это аналогичный вывод, к которому я пришел, но должны ли мои службы домена быть выставлены в модели? или это правильный способ сделать это? – Josh

+0

Как правило, вы вызываете этот вызов в своем контроллере после вызова конструктора модели, но если это то, что должно возникать каждый раз при инициализации новой модели, нет причин, по которым вы не должны позволить своей модели потреблять ваши услуги в этом случае. Если вы обеспокоены созданием слишком жесткой связи между уровнем презентации и уровнем домена, возможно, вы могли бы передать экземпляр вашего контроллера «DomainServices» в бизнес-конструктор модели через интерфейс? –

+0

Сказав это, у меня возникнет соблазн просто сделать этот вызов в конструкторе по первоначальному запросу GET, а затем заполнить его AJAX с этого момента. –

Смежные вопросы