目前我有一个Controller,AssetController,它具有导航资产树的方法。
我使用此控制器导航资产的“图库”,控制器方法当前返回ViewResult
。
我开始构建另一种查看相同数据的方法,这些数据将使用ajax并且不希望ViewResult
返回,而是JsonResult
。
我想尽可能多地重复使用我的控制器逻辑。我可以在这里想到两个选择:
将我的所有控制器方法更改为仅返回JsonResult
,然后更改当前的视图以使用json显示整页。
缺点:这会将更多页面加载/重定向逻辑推送到客户端。它也使我认为深层链接问题。使用完整视图,页面的URL非常“链接友好”,因为用户可以复制并粘贴链接并将其传递给某人,并且它将会转到他们期望的位置。返回JsonResults意味着URL不会改变,因此深层链接变得更具挑战性
重构我当前的控制器,以便将“共享”代码移动到控制器中的私有方法中。创建返回JsonResult
的新操作,并保留返回ViewResult的现有方法。
这是我目前的选择,因为它似乎在控制器中保留了更多代码,使单元测试更容易。但它似乎与UI有点过分耦合,当我想以不同的格式返回数据时会发生什么,我是否只是不断添加具有不同ActionResult
类型的新控制器操作?这太糟了吗?
是否有一种更聪明的方法来处理情况,或者我的方法之一比另一种方式更优惠?
更新
以下是一些代码示例:
目前我有这个:
public ActionResult ViewObject(PathModel inPath)
{
using (engine)
{
var metaData = engine.GetFileMetaData(inPath.Path);
return View(metaData); //This is returning a ViewResult type
}
}
我正在考虑做这样的事情
private FileMetaDataModel ViewObjectInternal(PathModel inPath)
{
using (engine)
{
var metaData = engine.GetFileMetaData(inPath.Path);
return metaData;
}
}
public ActionResult ViewObjectAsJSON(PathModel inPath)
{
var jsonResult = new JsonResult();
jsonResult.Data = ViewObjectInternal(inPath).ToJson();
return jsonResult // this is returning my data as JSON;
}
public ActionResult ViewObjectAsView(PathModel inPath)
{
return View(engine.GetFileMetaData(inPath.Path)); //This is returning a ViewResult type
}
答案 0 :(得分:2)
为什么不简单地返回ActionResult?
public ActionResult Detail()
{
// controller logic here
if (Request.IsAjaxRequest())
return Json(model);
return View(model);
}
答案 1 :(得分:0)
你可以将结果类型设置为ActionResult。所有其他结果都是从它继承的
答案 2 :(得分:0)
选项#3可以使用两者的混合。你不需要100%的时间使用jsonresult。如果您对网址感到担忧,可以使用两者的混合。 您有主视图,然后使用jQuery动态加载每个结果。这通常更适合具有多个数据的应用程序 - 因此感知应用程序加载速度更快(主视图返回后跟绑定数据) - 所以你可以肯定地走这条路线并理解搜索引擎不会索引你的退货数据。我在这里假设您的应用程序数据虽然不会被索引。如果它 - 那么jsonresult不是去这里的方式。