2016-10-17 37 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技術應該適合您的情況。 –

相關問題