在以下示例(taken from MSDN)中,作者从类型为GetItemsAsync(...)
的{{1}}函数返回ViewModel。如果我从这样的函数(即 NOT 一个动作方法)返回一个ViewModel,比如myViewModel,该怎么办?我该怎么做?
Task<List<TodoItem>>
更新:
以下不起作用。请参阅以下错误:
public class PriorityListViewComponent : ViewComponent
{
private readonly ToDoContext db;
public PriorityListViewComponent(ToDoContext context)
{
db = context;
}
public async Task<IViewComponentResult> InvokeAsync(
int maxPriority, bool isDone)
{
var items = await GetItemsAsync(maxPriority, isDone);
return View(items);
}
private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone)
{
return db.ToDo.Where(x => x.IsDone == isDone &&
x.Priority <= maxPriority).ToListAsync();
}
}
查看:
public class TestVCViewComponent : ViewComponent
{
public async Task<CustomViewModel> GetCustomViewModel(int ProjID)
{
CustomViewModel myViewModel = await GetFromDb();
return myViwModel;
}
//then call it:
public async Task<IViewComponentResult> InvokeAsync(int ProjID)
{
return View(GetCustomViewModel(ProjID));
}
}
错误:
InvalidOperationException:传递给ViewDataDictionary的模型项的类型为&#39; System.Threading.Tasks.Task`1 [myWebApp.Models.CustomViewModel]&#39;,但此ViewDataDictionary实例需要类型的模型项&#39; myWebApp.Models.CustomViewModel&#39;
我的评论:
但是如果你看到这个MSDN article我几乎一样,除了我使用文章正在使用的@model myWebApp.Models.CustomViewModel
...Some html here....
@await Component.InvokeAsync("TestVC", new { ProjID = Model.ProjectId });
--some other html here...
而不是Task<CustomViewModel>...
。
答案 0 :(得分:2)
在您的UPDATE代码中,您必须等待GetCustomViewModel调用
替换
return View(GetCustomViewModel(ProjID));
与
return View(await GetCustomViewModel(ProjID));
答案 1 :(得分:0)
您将如何编写异步方法来返回自定义类型:
public async Task<CustomViewModel> GetCustomViewModel()
{
CustomViewModel myViewModel = await GetFromDb();
return myViwModel;
}
然后调用它:
var customViewModel = await GetCustomViewModel();