2016-10-17 33 views
0

我在MVC中使用WCF服务,当WCF服务的某些方法调用时,我需要WCF服务中的部分视图HTML。价值不符合预期范围内的MVC与WCF服务

我在我的WCF服务中使用下面的代码来呈现HTML,但无法成功,因为我在'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; 
     } 
    } 

我打电话像上面这样的方法:

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

管窥

@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

我很困惑你的问题:使用wcf服务来提供html文件,特别是使用剃刀? –

+0

它必须在View代码的某个地方爆炸。你可以调试它,并寻找一个内部异常,可能会给你一个线索在哪里? –

+0

没有内在的例外。是的,我使用WCF服务来提供html文件。 – PrinceT

回答

0

这听起来像你的情况是,你想要一个呼叫者SE找到一个JSON请求并获得一个JSON响应(?),其中响应的一个元素是一个完整的HTML页面(作为一个字符串),客户端将通过其他方式呈现该响应。这里的答案是基于这个假设。

另一种方法是编写客户端来调用常规的MVC控制器方法,并让MVC为您完成所有工作;那么上面的代码都不是必需的。

如果这不起作用,你仍然可以编写你的页面,就好像它将以正常方式访问(控制器方法返回视图),然后你可以使用HttpClient从WCF服务中调用它方法;那会为你提供一个持有整个渲染页面视图的字符串。

+0

实际情况是我有一个服务器,这是调用这个WCF服务托管在MVC和 this WCF服务需要来自视图的HTML输出,SignalR Hub将使用它来调用Java脚本的方法 – PrinceT

+0

因此,HttpClient技术应该适合您的情况。 –

相关问题