2017-02-10 5 views
-2

Я пытаюсь создать действие асинхронной в MVC 4.Как звонить ViewModel асинхронно в MVC 4

public async Task<ActionResult> Index(bool MyList, int Verified, string searchText) 
     { 
ProductViewModel pvm =await new ProductViewModel(MyList, Verified, searchText); 
      return View(pvm); 
} 

В приведенном выше коде, где я звоню ProductViewModel конструктор он показывает

не может ждать ProductViewModel

После этого я попытался сделать мой конструктор асинхр но конструктор показывает ошибку,

Этот метод асинхронной не хватает 'ждать' оператора

Я создал ProductViewModel следующим образом,

public class ProductListViewModel 
    { 
     public MyEntities _context; 
     public bool _verified; 

     public async Task<ProductViewModel> ProductViewModel(bool MyList, int Verified, string searchText) 
     { 
      _context = new MyEntities(); 
      this.search = searchText; 
      this.SelectedListType = MyList; 
      this._verified= Verified; 

     } 

    public int SelectedListType { get; set; } 
     public IEnumerable<SelectListItem> VerifiedTypeList 
     { 
      get 
      { 
       List<ListTypeViewModel> ltvm = new List<ListTypeViewModel>(); 
       ltvm.Add(new ListTypeViewModel(1,"Verified")); 
       ltvm.Add(new ListTypeViewModel(0,"Pending")); 
       var allVerifiedType = ltvm.Select(c => new SelectListItem 
       { 
        Value = c.ListValue.ToString(), 
        Text = c.ListText 

       }); 
       return DefaultVerifiedTypeList.Concat(allVerifiedType); 
      } 
     } 
     public IEnumerable<SelectListItem> DefaultVerifiedTypeList 
     { 
      get 
      { 
       return Enumerable.Repeat(new SelectListItem 
       { 
        Value = "-1", 
        Text = "All" 
       }, count: 1); 
      } 
     } 
    public List<ProductViewmodel> ProductList 
     { 
      get 
      { 
       List<ProductViewmodel> pdvmList = new List<ProductViewmodel>(); 
       foreach (var pm in _context.GetProductList(SelectedListType, _verified, search).ToList()) 
       { 
        try 
        { 
         ProductViewmodel pdvm = new ProductViewmodel(); 
         pdvm.Price = pm.Price; 
         pdvm.ProductID = pm.ProductID; 
         pdvm.ProductName = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(pm.ProductName.ToLower()); 
         pdvm.IsVerified = pm.Verified; 
         pdvmList.Add(pdvm); 
        } 
        catch (Exception error) 
        { 
         Console.WriteLine(error.Message); 
        } 
       } 
       return pdvmList; 
      } 
     } 
} 

Спасибо заранее.

+0

1 - Почему вам нужно это действие, чтобы быть асинхронной? Есть ли какие-либо операции блокировки потоков в этом действии? 2- Может быть, личное мнение, но эта модель взгляда имеет слишком много обязанностей, и если я не ошибаюсь, она использует контекст EF и попадает в базу данных, - похоже, это довольно беспорядок. – Developer

+0

да, вы правы, на самом деле мое действие занимает слишком много времени, чтобы загрузить веб-страницу. –

+0

MVC или нет, вы не можете сделать конструкторы async. Подробнее см. В отмеченном дубликате. –

ответ

-1

Не уверен, что конструкторы могут быть асинхронными, но вы можете называть их асинхронно экземпляра объекта асинхронно:

ProductViewModel pvm = null; 
await Task.Run(async() => { 
           pvm = new ProductViewModel(MyList, Verified, searchText); 
          }); 
Смежные вопросы