次の例では(taken from MSDN)、のビューモデルをTask<List<TodoItem>>
という関数から戻しています。このような関数(例えば、NOTのアクションメソッド)からViewModel、たとえば、myViewModelを返すとどうなりますか?どうすればいい?アクションメソッド以外のサポート関数からViewModelを返す方法
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();
}
}
UPDATE:
動作しません後。
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));
}
}
ビュー:
@model myWebApp.Models.CustomViewModel
...Some html here....
@await Component.InvokeAsync("TestVC", new { ProjID = Model.ProjectId });
--some other html here...
エラー:
と、InvalidOperationException:ViewDataDictionaryに渡されたモデルアイテムのタイプが「System.Threading.Tasksで以下のエラーを参照してください。 .Task`1 [myWebApp.Models.CustomViewModel] 'が、このViewDataDictionaryインスタンスには' myWebApp.Models.CustomViewModel 'タイプのモデル項目が必要です。
私のコメント:
しかし、あなたはこのMSDN articleを見れば、私は記事が使用されていることをTask<CustomViewModel>...
代わりのTask<List<TodoItem>>
を使用していますことを除いて、ほぼ同じことをやっています。
public async Task<CustomViewModel> GetCustomViewModel()
{
CustomViewModel myViewModel = await GetFromDb();
return myViwModel;
}
それを呼び出す:あなたのUPDATEコードで
var customViewModel = await GetCustomViewModel();
メソッドから値を返す方法を尋ねていますか? –
@EdPlunkettいいえ。私は、Dbからデータを取り込んだ後、myViewModelを返す必要があります。私は人口を埋めることができます。関数がアクションメソッドではない場合に、関数のシグネチャについて混乱します。 – nam
私はお詫びします、私は質問を誤解しました。 –