如何在Asp.Net Core中制作可重用的控制器

时间:2017-02-09 10:05:20

标签: c# json asp.net-core asp.net-core-mvc

我正在开发我的第一个Asp.Net Core项目,该项目既支持Web客户端,也支持Game客户端(用Unity编写)。

现在,我开始使用Visual Studio 2015提供的默认 Asp.Net核心Web应用程序项目模板,包括个人用户帐户的身份验证。

大多数(如果不是所有生成的控制器都返回视图)通常遵循以下模式:

    [HttpGet]
    [AllowAnonymous]
    public IActionResult Get()
    {
        //Do something smart
        return View();
    }

此方法返回 View ,如您所见,并且在Web客户端请求时一切正常。 但是如果Game正在向同一个方法发送请求怎么办? 在这种情况下,需要一个JSON响应(不是View / html文档),我的问题是在Asp.Net Core中支持它的推荐“模式”是什么?

我应该将api放回到单独的控制器中,从而复制一些逻辑吗?对我来说感觉不对......

或者我应该检查预期响应格式的请求,并实现基于此返回不同响应的逻辑? 我也不特别喜欢这种方法......

对我而言,似乎 Asp.Net Core 通过直接从API提供UI格式的响应来解决问题,但这可能是我在这里错过的......

任何指针?

2 个答案:

答案 0 :(得分:2)

当返回类型为IActionResult时,您还可以返回Json消息,例如return Json(myReturnObject)。您可以添加if以返回JSON消息,当它为false时,它将返回视图。

您可以根据X-Requested-With添加if:

if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
    return Json(myObject);
}

我建议通过响应类型将请求拆分为不同的控制器方法,并将私有方法中的共享代码/逻辑添加到另一个类中,可能您也会在其他地方使用它。通过这样做,您将能够进行适当的测试,并且在返回视图或json消息时不会感到困惑。

希望这有帮助。

答案 1 :(得分:1)

如果您想要网页和游戏的单独控制器或操作,您可以将逻辑移动到控制器调用的类中。

这样会更好,遵循单一责任规则,而不是一个操作返回两种响应类型