【发布时间】:2018-09-18 20:47:41
【问题描述】:
我在带有 Angular 前端的 .NET Web API(非核心)项目中使用 Entity Framework。 目前,我能找到的唯一补丁实施示例是针对 ASP.Net Core 产品的 - 所以我首先想确认 patch 是否甚至可以用普通的 ASP.Net Web API(不是核心)。
我想在我的一些控制器中实现patch,但默认情况下,实体控制器似乎没有附带补丁操作的代码。相反,它带有GET、PUT、POST 和DELETE。我的实体控制器中需要什么代码才能使补丁请求有效?有没有办法在添加新的实体控制器时指定这一点,还是必须始终手动输入?
我的控制器:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using api.Models;
using api.Models.my_model;
using System.Net.Mail;
using System.Configuration;
namespace api.Controllers.my_model
{
public class myController : ApiController
{
private myCodeFirst db = new myCodeFirst();
// GET: api/my
public IQueryable<myTable> GetmyTable()
{
return db.myTable;
}
// GET: api/my/5
[ResponseType(typeof(myTable))]
public IHttpActionResult GetmyTable(int id)
{
myTable myTable = db.myTable.Find(id);
if (myTable == null)
{
return NotFound();
}
return Ok(myTable);
}
// PUT: api/my/5
[ResponseType(typeof(void))]
public IHttpActionResult PutmyTable(int id, myTable myTable)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != myTable.ID)
{
return BadRequest();
}
db.Entry(myTable).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!myTableExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
// POST: api/my
[ResponseType(typeof(myTable))]
public IHttpActionResult PostmyTable(myTable myTable)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.myTable.Add(myTable);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = myTable.ID }, myTable);
}
// DELETE: api/my/5
[ResponseType(typeof(myTable))]
public IHttpActionResult DeletemyTable(int id)
{
myTable myTable = db.myTable.Find(id);
if (myTable == null)
{
return NotFound();
}
db.myTable.Remove(myTable);
db.SaveChanges();
return Ok(myTable);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool myTableExists(int id)
{
return db.myTable.Count(e => e.ID == id) > 0;
}
}
}
【问题讨论】:
-
使用
[HttpPatch]属性。事实上,您应该尽可能使用所有 Http 方法属性,而不是依赖命名约定 -
同意 maccettura。像这样的命名约定实际上会导致方法命名不佳,从而导致可维护性和可读性差。
-
谢谢大家。你们中的任何一个都可以发布一个控制器实现补丁的示例吗?我在网上找到的所有示例都是针对
ASP.NET Core的,并使用 JsonPatchDocument 之类的命名空间,这在.Net Web API(非核心)中似乎不可用,而这正是我正在使用的。
标签: c# angular entity-framework asp.net-web-api patch