【问题标题】:How to do [HttpGet] from ASP.NET core for arbitrary argument如何从 ASP.NET 核心执行 [HttpGet] 获取任意参数
【发布时间】:2019-11-01 03:42:19
【问题描述】:

我通过 APS.NET 核心和 CRUD 原理学习 Angular

我有这两种方法:

/// <summary>
/// Retrieve all items from Books.
/// </summary>
/// <returns>Books items List</returns>
// GET: api/BooksXml
[HttpGet]
public IActionResult GetBookItems()
{
    List<BookItem> BookItems = new List<BookItem>();
    XDocument doc = _db.GetXmlDb();
    List<BookItem> bookitems = doc.Descendants("book").Select(x => new BookItem()
    {
        Id = (string)x.Attribute("id"),
        Author = (string)x.Element("author"),
        Title = (string)x.Element("title"),
        Genre = (string)x.Element("genre"),
        Price = (decimal)x.Element("price"),
        Publish_date = (DateTime)x.Element("publish_date"),
        Description = (string)x.Element("description")
    }).ToList();
    return Ok(bookitems);
}

/// <summary>
/// Returns a Book item matching the given id.
/// </summary>
/// <param name="id">Id of item to be retrieved</param>
/// <returns>Book item</returns>
// GET: api/BooksXml/5
[HttpGet("{id}")]
public IActionResult GetBookItems(string id)
{
    XDocument doc = _db.GetXmlDb();
    XElement result = doc.Descendants("book").FirstOrDefault(el => el.Attribute("id") != null &&
                 el.Attribute("id").Value == id);
    List<BookItem> BookItems = new List<BookItem>();
    if (result != null)
    {
        BookItem Book = new BookItem();
        Book.Id = (string)result.Attribute("id");
        Book.Author = (string)result.Element("author");
        Book.Title = (string)result.Element("title");
        Book.Genre = (string)result.Element("genre");
        Book.Price = (decimal)result.Element("price");
        Book.Publish_date = (DateTime)result.Element("publish_date");
        Book.Description = (string)result.Element("description");
        BookItems.Add(Book);

    }
    return Ok(BookItems);
}

它们都是正确的 get 方法,我更想要的是另一个带有路由的 get,这样我就可以在我的后端书籍数据库中搜索书名。

像这样:(BooksXmlController.cs)

 /** GET all books from server. */
  getBookItems(): Observable<BookItem[]> {
    return this.http.get<BookItem[]>(this.BookItemsUrl);
  }

  /** GET book by id. */
  getBookItem(id: string): Observable<BookItem[]> {
    const url = `${this.BookItemsUrl}/${id}`;
    return this.http.get<BookItem[]>(url);
  }

  /** GET book by title from server. */
  getBookByTitle(title: string): Observable<BookItem> {
    const url = `${this.BookItemsUrl}/${title}`;
    return this.http.get<BookItem>(url);
  }

注意getBookByTitle,如何将“标题”映射到 ASP.NET 核心后端 [HttpGet]

【问题讨论】:

    标签: c# angular typescript asp.net-core asp.net-core-mvc


    【解决方案1】:

    在您的控制器中添加另一个接受字符串作为参数的操作:

    [HttpGet]
    public IActionResult GetBookItemsByTitle(string title)
    {
    }
    

    如果你想调用这个动作,url 将是:

     const url = `${this.BookItemsUrl}?title=${title}`;
    

    我建议看一下Routing in ASP.NET Core

    编辑:

    如果您想重用当前存在的代码,请从路由中删除 {id} 并添加标题:

    [HttpGet]
    public IActionResult GetBookItems(string id, string title)
    {
    }
    

    之后,您可以使用这些 URL 调用您的方法:

    const url = `${this.BookItemsUrl}?id=${id}`;
    const url = `${this.BookItemsUrl}?title=${title}`;
    const url = `${this.BookItemsUrl}?id=${id}&title=${title}`;
    

    【讨论】:

    • 谢谢,但我已经在控制器中有一个方法,它带有像 GetBookItems(string id) 这样的字符串,我明白我不明白,但我学会了......:)
    • 是否要重用GetBookingItems(string id)方法?
    • 我想搜索书名、作者、价格等信息,使用一种方法可能不是一个好主意
    • 感觉更像是需要一个“SearchBookItems”。在第一条评论中,您说控制器中已经有一个方法接受字符串作为参数。如果它们具有不同类型的逻辑(搜索/获取),那么多个方法接受相同类型的参数并没有错
    • 您能提供给我们您最新版本的代码吗?
    【解决方案2】:

    你可以通过定义路由约束来试试这个

    int 约束,因此您的路线将只接受 int id

    [HttpGet("{id:int}")]
    public IActionResult GetBookItems(int id)
    

    字母代表(仅接受字母)

    [HttpGet("{title:alpha}")]
    public GetBookByTitle(string title)
    

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2011-10-20
      • 2017-12-25
      • 2018-10-25
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多