如何在Asp.Net Core中创建可重用控制器

问题描述:

我正在开发我的第一个Asp.Net Core项目,该项目同时支持Web客户端和Game客户端(用Unity编写)。现在如何在Asp.Net Core中创建可重用控制器

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

大多数,如果不是所有生成的控制器都返回看法,以下这种模式一般:

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

该方法返回一个查看,你可以看到,当通过网络请求的一切都很好客户。 但是如果游戏正在向同一方法发送请求呢? 在这种情况下,预计会发生JSON响应(而不是View/html文档),我的问题是在Asp.Net Core中支持这个建议的“模式”是什么?

我应该把API返回单独的控制器的JSON,因此重复一些逻辑?它不适合我...

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

对我来说,这似乎Asp.Net核心混乱的事情了直接从API提供UI格式的反应,但它可能是我已经错过了这里...

任何指针?

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

这将是更好的,并按照单一职责原则,而不是一个动作返回两个响应类型

+0

我不同意。来自一个动作的两个或多个响应类型可以避免代码逻辑的重复(例如验证数据) –

+0

代码复杂性的代价。使用路由在MVC或web api操作之间进行选择,而不是如果语句。将非UI逻辑移入服务中。将服务注入API和基于视图的控制器。正如这个答案所示。 – ssmith

+0

J Doe它不会重复,因为您将逻辑转移到类中。这两个控制器操作具有不同的“职责”,因为它们返回不同的类型。这是固体原理之一。它会使代码更清晰。 – James

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

如果基于X-Requested-With可以添加一个:

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

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

希望这会有所帮助。

+0

感谢您回应Hakany,但我应该立足于我的if语句? 请求头中的一些信息? – YonZo

+0

当你发送一个ajax请求时,它会在标头中总是发送'X-Requested-With',值为'XMLHttpRequest':HttpRequest.Headers [“X-Requested-With”] ==“XMLHttpRequest”或者在该请求的头部手动。您也可以*添加自定义标题键值,在这种情况下,您还需要进行更改以接受自定义标题键。 – hakany

+0

将if语句添加到* every * action方法会导致较差的代码质量。最好把真正的逻辑转移到一个服务中,并且有一个非常简单的动作来返回视图,而另一个将JSON作为web api返回。 – ssmith