2017-01-22 80 views
0

我正在将MVC控制器重构为不同类中的较小块,并且我来到了一个部分,我返回一个“return StatusCode(500,”Some消息“)”项目。如何返回一个MVC控制器之外的StatusCode对象

据我所知,我似乎无法在控制器外进行此操作。

这是可能的,或者我必须找到一种替代方式返回响应,并将其转换为适当的类型回调用代码(MVC的控制器)?

我可以看到自己拥有的一个问题是MVC操作的原始类型是IActionResult,因此在操作中我一直在返回任何适当的响应,有时查看(,模型),有时Json()和其他时间StatusCode(< 500>,),即我的回应不一致。

对我来说,是否有一种自然的方式来取代并将此代码移动到另一个类中以使其工作,或者我将不得不手工制作自己的对象来表示我将以其他方式并在控制器中返回的内容,并且如果那么,建议什么?

总之,理想的我希望能够返回一个动作的结果,例如在一个类“返回视图(”我的视图名称”就是myModel)控制器之外。 我怎样才能做到这一点?

它感觉很脏,但也许包含一个包含状态码,消息,对象(作为模型),视图名称和一个名为ActionResultType的新枚举的单个对象,其值为“StatusCode”,“Json”和“View” ,所以我可以很容易地合理它映射回它的合适的自然状态,当控制器接收到响应。

也许我会有点远,而是应该只专注于获得逻辑的主要部分出的控制者,而不是试图在别的地方建立一个更充实的回应?

如果可能的话,我很想得到每个动作的结果约10行,但除非我能想出一个很好的方式返回从别的地方适当的响应,它可能是一个斗争。

+3

您的控制器之外的逻辑不应该知道或关心HTTP错误代码,请将这些内容保留在您的MVC操作中。 – DavidG

+0

所有这些都有一个基本类型的ActionResult,所以我不知道是什么问题。 –

+0

你可以尝试使用“return InternalServerError(new Exception(”SOME CUSTOM MESSAGE“));” –

回答

0

如果需要控制器之间共享的代码,则可以设置一个基本控制器以保持共享代码和继承需要访问的任何其他控制器上基本控制器。

ActionResult包含所有你想要的东西。你想在你的自定义对象中的所有东西都作为ActionResult的子类存在。 JsonResult是ActionResult的一个子类。每个错误代码都有几个子类。我相信HttpNotFoundResult是另一个。

我建议在你的控制器里面保留大部分的ActionResult/Redirect/View/StatusCode。这是它通常位于的地方。

0

可以替代那些:

var result = new ObjectResult("Some message"); 
result.StatusCode = statusCode; 
return result; 

这是什么的StatusCode助手方法做反正。

如果你并不需要的信息,然后你可以做:

return new StatusCodeResult(500); 

在文件的顶部只需添加using Microsoft.AspNetCore.Mvc;

相关问题