我正在编写我的第一个webapi2控制器应用程序,以便在Azure上托管。
我正在使用招摇来测试apis。
我现在正在编写第一个通过webapi2控制器方法写入数据库的方法。
当我进入swagger测试方法时,我在“示例值”中看到我正在编写的表以及与之关系的所有表。
这会向我抛出一个红旗,因为有人可以根据我所看到的内容直接将值写入这些表而不会被删除。
示例表是一个帐户表:
{
"id": "string",
"email": "string",
"firstname": "string",
"lastname": "string",
"UserLevel": [
{
"pk": "string",
"fkAccount": "string",
"Level": 0
}
}
我关注的领域是UserLevel,我只想在后端设置。我不希望通过API设置可见。
控制器代码是:
public async Task<IHttpActionResult> PutAccount(string id, Account Account)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != Account.id)
{
return BadRequest();
}
db.Entry(Account).State = EntityState.Modified;
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!AccountExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.OK);
}
所以有两个问题: 1)我是否正确假设这将能够在UserLevel表中设置“Level”,如上所示? 2)如何防止这种情况发生/只允许写回一个表?
答案 0 :(得分:1)
您可以拥有一个AccountDTO类,其中只包含您要修改的属性并将其设置为Account对象,或者您可以在数据库中获取该帐户,并手动更新每个字段(考虑到您已经或多或少相同)控制器中的数据访问。)
如果您只想更新几个属性,我会将这些属性作为参数,而不是整个Account对象。