2016-10-17 1 views
0

J'utilise le service WCF dans MVC et j'ai besoin partiel HTML de vue dans le service WCF lorsque certaines méthodes de service WCF appelé.La valeur ne se situe pas dans la fourchette attendue dans MVC avec WCF Service

J'utilise le code ci-dessous dans mon service WCF pour rendre le code HTML mais je ne parviens pas à le faire car j'obtiens une erreur «la valeur ne se situe pas dans la plage attendue» dans la ligne «viewResult.View.Render».

public static string RenderRazorViewToString(string viewPath, object model, HttpContextBase context, Guid? tenantId) 
    { 
     try 
     { 
      using (var controller = new BaseController()) 
      { 
       if (context == null) 
       { 
        Logger.Error(
         "RenderRazorViewToString context is null.Empty string returned.", 
         new Exception("context is null.")); 
        return string.Empty; 
       } 

       var routeData = new RouteData(); 
       routeData.Values.Add("controller", "Base"); 
       controller.ControllerContext = new ControllerContext(context, routeData, controller); 
       controller.ViewBag.TenantId = tenantId; 
       return controller.RenderRazorViewToString(viewPath, model); 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("RenderRazorViewToString", ex); 
      return string.Empty; 
     } 
    } 

    public static string RenderRazorViewToString(this Controller controller, string viewPath, object model) 
    { 
     try 
     { 
      BrowserOverrideStores.Current = new CustomBrowserOverrideStore(); 
      controller.ViewData.Model = model; 
      using (var stringWriter = new StringWriter()) 
      { 
       var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewPath); 
       var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, stringWriter); 
       viewResult.View.Render(viewContext, stringWriter); 
       viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View); 
       return stringWriter.GetStringBuilder().ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("RenderRazorViewToString Extension Method", ex); 
      return string.Empty; 
     } 
    } 

J'appelle méthode ci-dessus comme:

var result = RenderRazorViewToString(@"~/Views/RealTimeView/BaysContainers/_BayEntry.cshtml", realTimeInfo, new HttpContextWrapper(System.Web.HttpContext.Current)) 

Vue partielle

@using CloudAmber.DSMS.DataClasses 
 
@model CloudAmber.DSMS.DataClasses.RealTimeBayInfo 
 
<div> 
 
    @if (Model.Fleets != null) 
 
    { 
 
     foreach (var item in Model.Fleets) 
 
     { 
 
      <li id="@[email protected]@item.DutyBoardNumber" @(item.IsAllocated ? "allocatedbus" : "unallocatedbuses") data-bayidcontainer="@Model.BayID" @(item.IsAllocated ? FiltersType.CirculatingBuses.ToString() : "")> 
 
       <span class="IconDiv"> 
 
        <a style="cursor: pointer;" id="[email protected]()" data-fleetnumber="@item.FleetNumber" data-vehiclebase="true" data-bayid="@Model.BayID" data-bayidentifier="@Model.BayIdentifier" data-baycode="@Model.BayCode" 
 
         data-operatorcode="@item.OperatorCode" data-ismanagebus="true"> 
 
         @{ 
 
      var color = item.IsAllocated ? "#000" : "#f00"; 
 
         } 
 
         <i class="fa fa-bus" style="font-size:20px;color:@color"></i> 
 
        </a> 
 
       </span> 
 
       @{ 
 
      string articulatedBus = string.Empty; 
 
      if (item.VehicleType == VehicleType.Articulated) 
 
      { 
 
       articulatedBus = MessageResource.ArticulatedFleetPostfix; 
 
      } 
 
       } 
 
       <span class="BusNo" title="@Resource.FleetNo - @Resource.PublicServiceCode"> 
 
        @Html.GetValueOrNa(item.FleetNumber) - @Html.GetValueOrNa(item.PublicServiceCode) @articulatedBus 
 
       </span> 
 
      </li> 
 
     } 
 
    } 
 
    <input type="hidden" id="[email protected]" value="@(Model.PredictedDepartureDateTime.HasValue ? Model.PredictedDepartureDateTime.Value.ToString("o") : string.Empty)" /> 
 
    <input type="hidden" id="[email protected]" value="@(Model.ScheduledDepartureDateTime.HasValue ? Model.ScheduledDepartureDateTime.Value.ToString("o") : string.Empty)" /> 
 
</div>

+0

Je suis confus au sujet de votre question: utilise un service wcf pour servir des fichiers html, en utilisant spécialement rasoir? –

+0

Il doit exploser dans le code View quelque part. Pouvez-vous le déboguer et chercher une exception interne qui pourrait vous donner une idée d'où? –

+0

Il n'y a pas d'exception interne. Oui, j'utilise le service WCF pour traiter les fichiers html. – PrinceT

Répondre

0

Il semble que votre situation est que vous voulez un appelant se s une requête JSON et obtenir une réponse JSON (?) où l'un des éléments de la réponse est une page HTML complète (sous la forme d'une chaîne), et le client va rendre cela par d'autres moyens. La réponse ici est basée sur cette hypothèse.

Une autre approche serait d'écrire le client pour appeler une méthode de contrôleur MVC régulière et laisser MVC faire tout le travail pour vous; alors aucun des codes ci-dessus n'est nécessaire. Si cela ne fonctionne pas, vous pouvez toujours écrire votre page comme si vous y accédiez normalement (une méthode de contrôleur renvoyant une vue), et vous pourriez utiliser un HttpClient pour l'appeler depuis le service WCF méthode; cela vous fournirait une chaîne contenant toute la page affichée.

+0

La situation actuelle est que j'ai un serveur qui appelle ce service WCF hébergé dans le MVC et this Le service WCF requiert une sortie HTML de la vue qui sera utilisée par SignalR Hub pour appeler les méthodes du script Java – PrinceT

+0

Donc la technique HttpClient devrait fonctionner pour votre situation. –