Как сделать [HttpGet] из ядра ASP.NET для произвольного аргумента - PullRequest
0 голосов
/ 18 июня 2019

Я изучаю Angular с ядром APS.NET и принципом CRUD

У меня есть два метода:

/// <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);
}

Они оба получают правильные методы, и я хотел, чтобы больше былоу меня есть другой маршрут, чтобы я мог искать в базе данных своих внутренних книг по названию книги.

вот так: (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]

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вы можете попробовать это, определив ограничение маршрута, например

int constrain, чтобы ваш маршрут принимал только int id

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

альфа-стенды (принимает только алфавиты)

[HttpGet("{title:alpha}")]
public GetBookByTitle(string title)
1 голос
/ 18 июня 2019

Добавьте еще одно действие в вашем контроллере, которое принимает строку в качестве параметра:

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

Если вы хотите вызвать это действие, URL будет:

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

Предлагаю взглянуть на Маршрутизация в ASP.NET Core .

EDIT:

Если вы хотите повторно использовать существующий на данный момент код, удалите {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}`;
...