我正在创建一个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

随机推荐

  1. 如何在何处以及如何创建另一个文件夹来放置文本文件,以便在导出时可以正常工作?

    我有一个文件夹,里面有我的文本文件,可以读写,可以在eclipse中工作。但是,当我导出到jar时,它失败了,因为找不到文件,这意味着它们没有被导出,我不知道如何让eclipse做到这一点。我确信解决方案就在那里,但我不知道我到底在寻找什么...

  2. 如何在存储过程中创建一个字符串列表变量,以及如何在另一个查询中使用它?

    我想在一个变量中保存一个字符串列表,然后我想在另一个查询中使用它。这是我的存储过程:CREATE PROCEDURE store_validated_sku_id (variable_sku_id OUT VARCHAR2) AS ...

  3. 如何在Prestashop1.6中删除托运页面中不需要承运商的标签,以及如何在管理左侧菜单中添加垂直滚动

    如何在Prestashop1.6中删除发货页面不需要承运商的标签?另外,如何在Prestashop1.6的管理端(后台)的左侧菜单中添加垂直滚动-我必须编辑哪个tpl文件才能添加左侧菜单的滚动??

  4. 在何处以及如何在Authorize.Net中使用苹果支付处理证书

    在尝试将Apple Pay Web添加到我的一个网站时,我对如何以及在哪里使用此Apple Pay支付处理证书感到困惑。我的支付处理器是Authorize.net我看了他们的文档:https://developer.authorize.ne...

  5. 使用ajax触发php脚本-如何以及在哪里编程?

    日安,我有一个php文件(db.php),其中包含以下函数function edit_record($id, $value){ if($this-db-query(UPDATE tbl_prototype SET value = ...

  6. R:如何在地图上显示城市级别数据,以及如何在地图的某个特定区域进行缩放

    我正在使用usmap和ggplot在地图上绘制人口。我的数据有两列-人口和邮政编码。问:我如何使用相同的库显示城市级别的数据,或者如果您知道其他库可以做这项工作。问:我正在绘制加州地图,我想放大洛杉矶县和附近的县。下面的代码给了我一个很好的...

  7. 如何使图像变直以及如何在底部滑块中使用项目符号我正在使用react-coverflow库

    我想直的图像,拇指图像,也是react-coverflow图书馆滑块的项目。??我正在使用这个代码 Coverflow width=960 height=500 displayQuantityOfSide={2} navig...

  8. 如何向stat_summary线条添加其他线条以及如何在ggplot2 geom_dotplot中更改形状?

    我正在制作ggplot,geom_dotplot,并通过‘stat_summary’添加了几行。请看下面的代码和图。stat_summary‘将生成表示mean、mean-sd和mean+sd的方框。ToothGrowth$dose - a...

  9. 如何在页面中心显示图像,以及如何在页面底部显示按钮

    我想要在页面的中心并排显示两个图像,以及在页面底部显示一个按钮。目前,两幅图像的对齐方式是水平居中。但是,我想要的是页面中心的两个图像。下面是我的代码:?table, th, td { border: 1px solid black; ...

  10. 单击按钮不触发单击事件以及如何在ROKU中导航另一个面板

    我在Roku中创建Login面板。在登录的时候,我点击ok按钮来浏览另一个面板。我创建了一个登录面板,使用两个文本框,一个用于用户名,另一个用于密码,以及两个按钮,一个用于登录,另一个用于取消。问题是我单击了登录按钮,但没有单击事件触发我在...