我正在编写一个可供Web应用程序和移动应用程序使用的API,我在我的技术堆栈中使用ASP.NET MVC。
目前,我有一个类似Rest的API服务,它以JSON格式返回数据。 这适用于移动应用程序,但我也想让它适用于Web应用程序。
让控制器操作返回HTML视图或JsonResult是一个很好的方法吗?
网络应用和移动应用之间的唯一区别是视图层;应用逻辑是一样的。
我想我可以创建一个用于Web应用程序的控制器,但我认为很多逻辑都会从API控制器中复制出来。
修改
我确实有另一个层来处理所有应用程序逻辑,但API控制器仍然有一些逻辑来在返回JSON响应时验证参数和错误处理。到目前为止,重复的逻辑将是验证部分。
以下是一些代码段:
public JsonResult GetList(string accessToken, string listId)
{
if (string.IsNullOrEmpty(accessToken))
return Json(new { success = false, exceptionMessage = "Facebook access token is required." });
if (string.IsNullOrEmpty(listId))
return Json(new { success = false, exceptionMessage = "The list id is required." });
string facebookId = null;
var facebookIdParseSuccess = GetFacebookId(accessToken, out facebookId);
if (!facebookIdParseSuccess)
return Json(new { success = false, exceptionMessage = "There was a problem accessing your Facebook profile information." });
try
{
_groceryListManager.FacebookId = facebookId;
var groceryList = _groceryListManager.GetList(listId);
GroceryListViewModel mappedList = new GroceryListViewModel();
Mapper.Map(groceryList, mappedList);
return Json(new { success = true, results = mappedList });
}
catch (Exception ex)
{
return Json(new { success = false, exceptionMessage = "..."});
}
}
答案 0 :(得分:2)
如果您的视图模型也适合作为JSON返回,那么在同一个操作中执行这两个模型都可以正常工作。类似的东西:
public ActionResult Foo()
{
FooModel model = new FooModel();
// Code here to build the model
if (Request.IsAjaxRequest())
return Json(model);
else
return View(model);
}
这也有助于指导您在使用渐进增强方面取得成功。如果HTML和JSON的URL相同,那么在标记中使用可访问/ SEO友好的URL会更容易,然后通过添加不显眼的事件处理程序来逐步增强,以替换在启用JavaScript的浏览器中对JSON的请求。< / p>
答案 1 :(得分:1)
我之前看过一个动作方法返回,但是,在我看来,你最好有两个独立的动作方法。你可以让他们用共享代码调用另一个方法,但由于它们被用于两个非常不同的东西,你可能会发现如果你有两个方法就更容易维护(未来的要求可能导致一个方法改变一个这种方式很难在单一方法中支持这两种方法)。
它们是否在同一个控制器中实际上更依赖于应用程序的性质,大小和复杂性。我已将API分离为与HTML完全不同的项目。我已经共享了用于访问数据和其他常用功能的dll,但MVC项目是不同的。
答案 2 :(得分:1)
取决于您想要实现的目标:
创建一个返回正确视图的ViewEngine 例如:http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
或者您可以根据URL中的参数返回视图或JSON
答案 3 :(得分:0)
但我认为很多逻辑都会 从API控制器复制。
我想你自己回答了这个问题。我会把它们放在同一个控制器中。 :)