【问题标题】:How to pass model to WebApi controller?如何将模型传递给 WebApi 控制器?
【发布时间】:2023-04-10 08:22:01
【问题描述】:

我需要编写 WebApi 控制器。任务是从现有的普通 mvc 控制器迁移到 WebApi 控制器。

在这个项目中,几乎所有的编程之美都被用到了:-

  • 设计模式 - 存储库 + UOW、工厂 + nUnit
  • 依赖注入
  • 固体

这是我在MyApp.Domain 层中的模型

public class Customer
{
   //please note that we are using Repository pattern & so no Data Annotations like Required, Key are not used here. 
   public int CustomerID { get; set;}

   public string CustomerName { get; set;}

   public string EmailAddress { get; set;}
   // & so on
}

MyApp.UI 层中,存在用于验证的 ViewModel,然后将模型传递给服务层。所以这就是我的 MVC 控制器的样子

  public class CustomerVM
  {
     [Required]
     public int CustomerID { get; set;}  // & so on the other properties.

  }


  public ActionResult Registration(Customer VM)
  {
         if(Modelstate.IsValid)
         {
            //call service layer 
         }
         else
         {

         }
  }

现在我的当务之急是将这个控制器迁移到 WebApi 控制器。 此后,我创建了一个单独的项目为MyApp.WebApi

现在我的疑问是我应该如何将模型传递给这个 WebApi 控制器。

我正在考虑将 ViewModel 从 UI 层分离以分离 项目为MyApp.ViewModels,并将所有视图模型放在这一层 & 引用 UI 层和 WebApi 层中的 dll。

 public string POST([FromBody]CustomerVM customer)
 {
    if(Modelstate.IsValid)
    {
        //call the other service layer which will take care of DB handling
       return "Success";
    }
    else
    {
       return "Error";
    }   
 }

这是正确的做法吗?还有其他正确的做法吗?

【问题讨论】:

  • 你这样做应该没问题。
  • @YashveerSingh,你确定吗??
  • 所以如果这是我所理解的。您想将现有的 MVC 项目转换为 WebApi 。因此,您可以像在 VC 项目中使用的那样使用现有的视图模型,web api 可以像 mvc 一样进行模型绑定。
  • @YashveerSingh 是的。你得到了我的要求。
  • 好的,所以重用同一个虚拟机应该不是问题。但我有一个问题,您是否打算拥有一个新的客户端 UI。我的意思是你要创建一个使用 webapi 的 nee 客户端应用程序吗?

标签: c# asp.net-mvc design-patterns asp.net-web-api dependency-injection


【解决方案1】:

在 RESTful API 中,您所称的 视图模型DTO 或在 Web API 俚语中,它们是 模型。 p>

您知道 ASP.NET MVC 和 WebAPI 具有相似的架构,并且在 ASP.NET MVC Core 中它们已被合并为一个单一的编程模型。也就是说,在 ASP.NET MVC 中有效的内容在 WebAPI 中也有效。

检查您是否不需要[FromBody] 属性。 模型自动从正文绑定。

【讨论】:

  • 我应该把你的帖子当作“我的方法是正确的”吗?
  • @Kgn-web 确实如此。看起来是正确的,其他细节可能更适合 SE.CodeReview。我的意思是,如果你想验证你的实际代码不仅在软件分层方面是好的......
【解决方案2】:

您也可以使用 IHttpActionResult 代替字符串并引发实际错误。

public IHttpActionResult  POST([FromBody] CustomerVM customer)
 {
   if (!ModelState.IsValid) {
        return BadRequest(ModelState);
    }
     return Ok("success");

 }

【讨论】:

  • 只是一个注释,我注意到您在单独的服务器上说了一些关于 api 的内容,您将通过 AJAX 调用它,您可能需要考虑启用 cors。 asp.net/web-api/overview/security/…
  • 是的,我将启用 CORS,然后添加域。 &感谢您的投入:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 2011-07-03
  • 2018-12-27
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
相关资源
最近更新 更多