如何(以及在何处)根据数据库验证API输入
我正在创建一个dotnet核心3.1API,以便在现有系统中工作。dbo.MyTable表有两个带有唯一约束的字段: ID和HumanReadableID。ID是一个GUID,当新的资源为POSTed时,由接口决定。HumanReadableID必须由用户决定,因此在执行插入之前,必须首先通过查询数据库来确保其唯一性。
我曾尝试使用自定义属性进行此验证,并在控制器方法接受的DTO上实现IValidatableObject
,但我无法将存储库注入到这两个对象中。
现在,控制器尝试使用存储库进行插入,如果HumanReadableID不是唯一的,则会抛出一个自定义异常,然后。。。下面是代码
[Route("[controller]")]
[ApiController]
public class MyThingsController : ControllerBase
{
/// Other methods
[HttpPost(Name = "CreateMyThing")]
public async Task<IActionResult> CreateMyThing(MyThingCreateDto myThingToCreate)
{
try
{
MyThingEntity entityToCreate = _mapper.Map<MyThingEntity>(myThingToCreate);
MyThingEntity entityToReturn = await _myRepository.InsertThing(entityToCreate);
MyThingDto myThingToReturn = _mapper.Map<MyThingDto>(entityToReturn);
return CreatedAtRoute(
"GetMyThing",
new {id = myThingToReturn.Id},
myThingToReturn);
}
catch (DuplicateHumanReadableIdException e)
{
ModelState.AddModelError("HumanReadableID",$"HumanReadableID {entityToCreate.HumanReadableId} is already used by site {e.IdOfThingWithHumanReadableId}");
return Conflict(ModelState);
}
}
}
这在一定程度上是可行的,但由此产生的错误的内容类型是application/json
而不是application/problem+json
。此外,这只是感觉控制器在这里有太多的责任。
缺少使用IValidatableObject或DataAnnotations进行验证的实现是什么?如果做不到这一点,我必须进一步操作控制器的ModelState中的哪些内容才能允许它发出符合标准的谴责?
转载请注明出处:http://www.lishuoershouche.com/article/20230401/1882939.html
随机推荐
-
如何在何处以及如何创建另一个文件夹来放置文本文件,以便在导出时可以正常工作?
我有一个文件夹,里面有我的文本文件,可以读写,可以在eclipse中工作。但是,当我导出到jar时,它失败了,因为找不到文件,这意味着它们没有被导出,我不知道如何让eclipse做到这一点。我确信解决方案就在那里,但我不知道我到底在寻找什么...
-
如何在存储过程中创建一个字符串列表变量,以及如何在另一个查询中使用它?
我想在一个变量中保存一个字符串列表,然后我想在另一个查询中使用它。这是我的存储过程:CREATE PROCEDURE store_validated_sku_id (variable_sku_id OUT VARCHAR2) AS ...
-
如何在Prestashop1.6中删除托运页面中不需要承运商的标签,以及如何在管理左侧菜单中添加垂直滚动
如何在Prestashop1.6中删除发货页面不需要承运商的标签?另外,如何在Prestashop1.6的管理端(后台)的左侧菜单中添加垂直滚动-我必须编辑哪个tpl文件才能添加左侧菜单的滚动??
-
在何处以及如何在Authorize.Net中使用苹果支付处理证书
在尝试将Apple Pay Web添加到我的一个网站时,我对如何以及在哪里使用此Apple Pay支付处理证书感到困惑。我的支付处理器是Authorize.net我看了他们的文档:https://developer.authorize.ne...
-
使用ajax触发php脚本-如何以及在哪里编程?
日安,我有一个php文件(db.php),其中包含以下函数function edit_record($id, $value){ if($this-db-query(UPDATE tbl_prototype SET value = ...
-
R:如何在地图上显示城市级别数据,以及如何在地图的某个特定区域进行缩放
我正在使用usmap和ggplot在地图上绘制人口。我的数据有两列-人口和邮政编码。问:我如何使用相同的库显示城市级别的数据,或者如果您知道其他库可以做这项工作。问:我正在绘制加州地图,我想放大洛杉矶县和附近的县。下面的代码给了我一个很好的...
-
如何使图像变直以及如何在底部滑块中使用项目符号我正在使用react-coverflow库
我想直的图像,拇指图像,也是react-coverflow图书馆滑块的项目。??我正在使用这个代码 Coverflow width=960 height=500 displayQuantityOfSide={2} navig...
-
如何向stat_summary线条添加其他线条以及如何在ggplot2 geom_dotplot中更改形状?
我正在制作ggplot,geom_dotplot,并通过‘stat_summary’添加了几行。请看下面的代码和图。stat_summary‘将生成表示mean、mean-sd和mean+sd的方框。ToothGrowth$dose - a...
-
如何在页面中心显示图像,以及如何在页面底部显示按钮
我想要在页面的中心并排显示两个图像,以及在页面底部显示一个按钮。目前,两幅图像的对齐方式是水平居中。但是,我想要的是页面中心的两个图像。下面是我的代码:?table, th, td { border: 1px solid black; ...
-
单击按钮不触发单击事件以及如何在ROKU中导航另一个面板
我在Roku中创建Login面板。在登录的时候,我点击ok按钮来浏览另一个面板。我创建了一个登录面板,使用两个文本框,一个用于用户名,另一个用于密码,以及两个按钮,一个用于登录,另一个用于取消。问题是我单击了登录按钮,但没有单击事件触发我在...