我有一个ASP.NET Core 2.1 Web应用程序,该应用程序是按照ASP.NET Core文档中Create Razor pages web app中的步骤创建的。一切都按预期进行,我使用了在搭建模型时创建的默认localdb。那部分很好。
但是,我需要做的是在生产环境中尝试使用相同的通用代码,在该生产环境中,所有CRUD函数都通过使用与我的Model对象直接匹配的JSON数据调用WebApi方法来执行。
例如,通过脚手架为“创建”创建的页面是这样的:
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Registration.Add(Registration); // Here
await _context.SaveChangesAsync(); // Here
return RedirectToPage("./Index");
}
和
public async Task OnGetAsync()
{
Registration = await _context.Registration.ToListAsync(); // Here
}
是否可以简单地更改每次出现的_context操作(如标记为“ // Here”的行)来使用对WebApi方法的调用?有没有更好的方法可以完成我想做的事情?
答案 0 :(得分:0)
您只能使用实体类。但是,您可以将JSON转换为您的实体类之一的实例。例如:
using (var response = await _client.GetAsync("/foo/1"))
{
var foo = await response.ReadAsAsync<Foo>();
_context.Add(foo);
await _context.SaveChangesAsync();
}
ReadAsAsync
方法是语法糖,它简单地将响应读取为字符串,然后将其传递给JSON.NET以转换为指定的类型。如果只有JSON字符串,则可以利用:
var foo = JsonConvert.DeserializeObject<Foo>(jsonString);
也就是说,这是一种代码气味。如果您的API已已与您的实体类进行交互,则所有工作都应在此完成。如果要添加新实体,则API上应该有一个端点。对于所有其他CRUD操作,也是如此。在相同的上下文中使用两个不同的应用程序,并且仅在其中部分运行,这是灾难的根源。