我很抱歉这个模糊的标题,我不知道如何简明扼要地解释。
我在ASP.NET中使用Entity Framework构建了一个演示应用程序,它显示了Spotify艺术家'和他们的专辑' info,但首先,用户必须先将数据库添加到数据库中,然后才能检查该艺术家信息。
因此,我们有Artist和Album类的模型,视图和控制器。
当用户通过表单从站点添加艺术家时,它会转到ArtistController类到Create方法。
// POST: Artists/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ArtistID,ArtistName")] Artist artist)
{
if (ModelState.IsValid)
{
db.Artists.Add(artist);
db.SaveChanges();
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
return Json(new { success = false }, JsonRequestBehavior.AllowGet);
}
(我编辑它以返回JSON,因为用户应该搜索艺术家,然后通过AJAX调用从结果列表中添加他们想要的那个)。
添加艺术家后该怎么办?我想现在将他们的专辑添加到数据库中,但我该怎么做呢?我需要再次向Spotify发出一个AJAX调用来获取这个艺术家专辑并添加它们。
那么,在AlbumsController.addAlbumsForArtist(ArtistID)
之前添加类似return Json(new { success = true }, JsonRequestBehavior.AllowGet);
之类的内容是不错的做法?然后在addAlbumsForArtist
AlbumsController
中为此艺术家专辑制作一个AJAX调用Spotify,然后添加它们。我认为这是最好的选择,但我不确定ASP.NET中的操作方法(如何做到这一点)(从另一个控制器调用控制器的最佳方式是什么? ?可以在addAlbumsForArtist
中创建AlbumsController
吗?如何调用该方法?将其设为静态?)
另外,有点无关,但数据库SaveChanges()
和SubmitChanges()
之间的区别是什么?
答案 0 :(得分:2)
这是一个非常大的问题,特别难以回答,但我会尝试给你一些指导。
从另一个控制器调用控制器的最佳方法是什么?
简短回答:不要这样做。
这里可能有用的一种架构方法是使用服务来为您完成繁重的工作。例如假设您创建了IAlbumService
,如下所示:
public interface IAlbumService
{
Task<IAlbum[]> GetAlbumsForArtist(int artistId);
}
然后你必须为它提供一个实现;类似的东西:
public class AlbumService : IAlbumService
{
public Task<IAlbum[]> GetAlbumsForArtist(int artistId)
{
// todo: hit spotify API and get albums.
var albums = new[]
{
new Album { Title = "Fabo sounds from the 70s" },
new Album { Title = "Just can't get enough nutella" }
};
return Task.FromResult(albums);
}
}
现在,您可以使用依赖注入为您的控制器提供相册服务的实例; ArtistController
的构造函数可能会变为:
private IAlbumService _albumService;
public ArtistController(IAlbumService albumService)
{
_albumService = albumService;
}
现在您的Create
方法将是:
public async Task<ActionResult> Create([Bind(Include = "ArtistID,ArtistName")] Artist artist)
{
if (!ModelState.IsValid) return Json(new { success = false });
db.Artists.Add(artist);
var albums = await _albumService.GetAlbumsForArtist(artist.ArtistID);
foreach (var album in albums)
{
db.Albums.Add(albums)
}
db.SaveChanges();
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
这仍然不是太棒了 - 你绝对不应该在你的控制器中做那么多工作 - 但这是朝着正确方向迈出的一步。希望有所帮助!