从我的问题中的奇怪,我怀疑我没有朝着正确的方向前进。
假设我有一个视图,其中有几个其他项目的分页列表。在第一次加载时,列表将加载列表的第一页(这是我尝试从模型中调用控制器中的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);
}
在每个页面按钮上单击,它将仅通过AJAX重新加载控制器中的JsonResult
方法,但这已经完成了。
答案 0 :(得分:2)
当页面刚加载时,只需模拟客户端上的按钮单击就更容易了,那么你只需要一个例程来完成所有获取数据,插入页面并正确格式化它。
否则,创建一个GetData函数,控制器例程(Index?)调用该函数,GetJSON例程调用以获取所需的任何数据。索引方法会将其粘贴到模型中以传递给视图,而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;
}
答案 1 :(得分: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更新。