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 再次调用控制器中的方法,但这已经完成。

4

2 回答 2

2

在页面刚刚加载时模拟客户端上的按钮单击更容易,然后您只有一个例程来完成所有获取数据,插入页面并正确格式化它。

否则,创建控制器例程(索引?)调用的 GetData 函数和 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;
}
于 2013-06-03T19:56:54.570 回答
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 更新。

于 2013-06-03T20:04:26.040 回答