如何从动作方法以外的支持函数返回ViewModel

时间:2016-11-30 16:10:32

标签: c# asp.net-core-mvc

在以下示例(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>...

2 个答案:

答案 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();