如何从视图模型中正确调用控制器中的JsonResult方法?

时间:2013-06-03 19:45:36

标签: c# asp.net-mvc

从我的问题中的奇怪,我怀疑我没有朝着正确的方向前进。

假设我有一个视图,其中有几个其他项目的分页列表。在第一次加载时,列表将加载列表的第一页(这是我尝试从模型中调用控制器中的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方法,但这已经完成了。

2 个答案:

答案 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更新。