【问题标题】:ASP.NET Core 2.1 API not taking parameterASP.NET Core 2.1 API 不带参数
【发布时间】:2018-11-14 18:50:20
【问题描述】:

我正在尝试从我的 API 传递一个参数,但它似乎没有接受它。我有一个我想要传递的姓氏(最终将被一个唯一的 id 替换),它最终将路由到个人资料视图或那个人。

这是我的 API 控制器:

   public class GetInquiryController : BaseController
{
    private GetInquiry manager;
    public GetInquiryController(IConfiguration config) : base(config)
    {
        manager = new GetInquiry(config);
    }

    [HttpGet]
    [Route("api/[controller]")]
    public IEnumerable<InquiryModel> Get(string lastName)
    {
        return manager.GetInquiriesByUser(lastName);
    }
 }

以及获取姓氏的存储过程的逻辑

  public class GetInquiry
{
    private readonly IConfiguration configuration;

    public GetInquiry(IConfiguration config)
    {
        configuration = config;
    }

    public IEnumerable<InquiryModel> GetInquiriesByUser(string lastName)
    {
        string ApplicationDB = configuration.GetConnectionString("ApplicationDB");
        List<InquiryModel> lstinquiry = new List<InquiryModel>();
        using (SqlConnection con = new SqlConnection(ApplicationDB))
        {
            SqlCommand cmd = new SqlCommand("spGetInquiriesByUser", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter lastNameParameter = cmd.Parameters.Add("lastName", SqlDbType.Char, 10);
            lastNameParameter.Value = lastName;
            con.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                InquiryModel inquiry = new InquiryModel();
                //inquiry.FormID = rdr["FormID"].ToString();
                inquiry.firstName = rdr["firstName"].ToString();
                inquiry.lastName = rdr["lastName"].ToString();
                inquiry.SID = rdr["SID"].ToString();
                inquiry.email = rdr["email"].ToString();
                inquiry.phone = rdr["phone"].ToString();
                inquiry.email = rdr["email"].ToString();
                inquiry.employer = rdr["street"].ToString();
                inquiry.city = rdr["city"].ToString();
                inquiry.state = rdr["state"].ToString();
                inquiry.zip = rdr["zip"].ToString();
                inquiry.date = rdr["date"].ToString();
                inquiry.comment = rdr["comment"].ToString();

                lstinquiry.Add(inquiry);
            }
            con.Close();
        }
        return lstinquiry;
    }
  }
}

我正在使用 VUE.js 并调用我的 API

methods: {
  editItem(lastName) {
    let id = lastName
    this.$http.get('http://localhost:61601/api/GetInquiry/', {
      id: lastName
    }),

我已经尝试在没有 IEnumerable 的情况下使用我的逻辑,我认为在这种情况下不会有所作为。

我想我得到的好处是,

“SqlException:过程或函数'spGetInquiriesByUser'需要参数'@lastName',但未提供”

当我在浏览器中输入我的 API 路由时,但是当我将 lastName 添加到我的路由或 Postman 的末尾时,我得到一个空白页面。

希望这是有道理的,如果我需要提供更多详细信息以及是否有人可以指出正确的方向,请告诉我!

【问题讨论】:

  • 你是如何调用 API 的?
  • @Shyju,我刚刚更新了我的问题。我正在使用 VUE.js 并在上面的方法中调用我的 API。
  • 您能否确认您实际上是在将 lastName 传递给该方法?也许,使用断点进行调试,这样您就可以首先验证这一点。

标签: asp.net api asp.net-core parameters


【解决方案1】:

您需要定义应从何处读取您的 lastName 参数。

如果要从路由中读取,请使用 FromRoute 属性

[HttpGet("{lastName}")] //api/GetInquiry/yourlastname
public IEnumerable<InquiryModel> Get([FromRoute]string lastName)
{
    return manager.GetInquiriesByUser(lastName);
}

如果要从查询字符串中读取,请使用 FromQuery 属性

[HttpGet] //api/GetInquiry?lastName=yourlastname
public IEnumerable<InquiryModel> Get([FromQuery]string lastName)
{
    return manager.GetInquiriesByUser(lastName);
}

注意:将 [Route("api/[controller]")] 移动到 GetInquiryController 类的顶部时,上述解决方案有效。

更新 当您添加您的 vue.js api 调用时,更能说明为什么这不起作用,您实际上是通过 id 名称调用 lastName 参数。将您的 id 道具更改为 lastName 将适用于上述情况

methods: {
  editItem(lastName) {
    this.$http.get('http://localhost:61601/api/GetInquiry/', {
      lastName: lastName
    }),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多