2014-01-06 4 views
0

У меня есть требование вызвать асинхронный метод из представления, но я понятия не имею, как это сделать. мой взгляд выглядит следующим образом:async calls in mvc view

@using Skipstone.Web.Services; 

@{ 
    var service = new UserService(new CompanyService()); 
    var users = await service.GetAll(); 

    ViewBag.Title = "Manage Users"; 
} 

@section Breadcrumb { 
    <ol class="breadcrumb"> 
     <li><a href="/">Home</a></li> 
     <li><a href="/Manage/Users">Users</a></li> 
    </ol> 
} 

<div class="container"> 
    <div class="row"> 
     <div class="col-md-12"> 
      <div class="message"></div> 

      <a href="/Manage/Users/Create">Create a new user</a> 

      <table class="table table-bordered users sortable"> 
       <thead> 
        <tr> 
         <th data-defaultsort="desc">Username</th> 
         <th>Email</th> 
         <th>Status</th> 
         <th data-defaultsort="disabled">Member of</th> 
         <th data-defaultsort="disabled"></th> 
        </tr> 
       </thead> 
       <tbody> 
        @foreach (var user in users) 
        { 
         <tr id="@user.Id"> 
          <td>@user.UserName</td> 
          <td>@user.Email</td> 
          <td> 
           @if (user.IsApproved) 
           { 
            <span class="label label-success label-approved">Approved</span> 
           } 
           else 
           { 
            <span class="label label-warning label-approved">Rejected</span> 
           } 

           @if (user.IsLockedOut) 
           { 
            <span class="label label-danger label-locked">Locked</span> 
           } 
          </td> 
          <td> 
           @foreach (var group in user.MemberOf) 
           { 
            <text>@group </text> 
           } 
          </td> 
          <td> 
           @if (user.IsApproved) 
           { 
            <a href="#" data-id="@user.Id" class="btn btn-default reject"><span class="glyphicon glyphicon-remove-sign"></span> @*<div class="visible-md visible-lg">Reject</div>*@</a> 
           } 
           else 
           { 
            <a href="#" data-id="@user.Id" class="btn btn-default approve"><span class="glyphicon glyphicon-ok-sign"></span> @*<div class="visible-md visible-lg">Approve</div>*@</a> 
           } 
           <a href="/Manage/Users/Edit/@user.Id" class="btn btn-default"><span class="glyphicon glyphicon-pencil"></span> @*<div class="visible-md visible-lg">Edit</div>*@</a> 
           <a href="#" data-id="@user.Id" class="btn btn-default delete"><span class="glyphicon glyphicon-remove"></span> @*<div class="visible-md visible-lg">Delete</div>*@</a> 
          </td> 
         </tr> 
        } 
       </tbody> 
      </table> 
     </div> 
    </div> 
</div> 

@section Scripts { 
    <link href="@Url.Content("~/Content/bootstrap-sortable.css")" rel="stylesheet" /> 
    <script src="@Url.Content("~/Scripts/bootstrap-sortable.js")" type="text/javascript"></script> 

    <script src="@Url.Content("~/Scripts/jquery.skipstone-users-index.js")" type="text/javascript"></script> 
} 

, как вы можете видеть, что линия гласит:

вар пользователей = ждут service.GetAll();

- асинхронный метод, но вы не можете вызывать асинхронные методы, не помещая их в метод async, поэтому я имею порочный круг.

С кем-то сталкивались раньше? Есть ли что-то, что я могу сделать, чтобы оно работало.

NB: У меня нет доступа к контроллеру, так как это виртуальное представление и не имеет контроллер, он подается из базы данных

Cheers,

/r3plica

+1

Я не совсем уверен, что вы подразумеваете под «виртуальным представлением без контроллера, базы данных "? –

+0

Я имею в виду, что нет контроллера. Я использую пользовательский VirtualPathProvider и MvcRouteHandler для маршрутизации любого виртуального трафика. Затем это соответствует пути с хранилищем путей в моей базе данных, который затем обслуживает html для требуемого представления. Таким образом, из-за этого нет контроллера, просто просмотр, который подается динамически – r3plica

+0

, аналогичный http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views – r3plica

ответ

0

Это плохой подход для использования асинхронных вызовов в ASP.NET, потому что страница ASP.NET сама по себе является асинхронной и не будет ждать завершения ваших операций async. Но есть некоторые трюки - прочитайте сообщение Скотта Хансельмана here Если никаких других вариантов не существует, я предложил бы запустить его синхронно, вызывая RunSynchronously()