2016-10-17 2 views
0

MVC 내에서 WCF 서비스를 사용하고 있으며 일부 WCF 서비스 호출시 WCF 서비스에서 부분 뷰 HTML이 필요합니다.WCF 서비스를 사용하는 MVC에서 값이 예상 범위를 벗어남

내 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

보기 코드가 어딘가에서 날아 와야합니다. 그것을 디버그하고 당신에게 단서를 줄 수있는 내부 예외를 찾을 수 있습니까? –

+0

내부 예외가 없습니다. 네, WCF 서비스를 사용하여 HTML 파일을 제공하고 있습니다. – PrinceT

답변

0

당신이 호출자에게 원하는 것입니다 그 JSON 요청을 찾아 JSON 응답 (?)을 얻습니다. 여기서 응답 요소 중 하나는 전체 HTML 페이지 (문자열)이고 클라이언트는 다른 수단을 통해 렌더링합니다. 여기서의 대답은 그 가정에 근거합니다.

다른 방법은 클라이언트가 일반 MVC 컨트롤러 메서드를 호출하고 MVC가 모든 작업을 수행하도록 작성하는 것입니다. 위의 코드 중 어느 것도 필요하지 않습니다.

정상적으로 작동하지 않는 경우 (보기를 반환하는 컨트롤러 메서드) 페이지를 작성한 다음 HttpClient를 사용하여 WCF 서비스 내에서 호출 할 수 있습니다 방법; 렌더링 된 전체 페이지보기를 유지하는 문자열을 제공합니다.

+0

실제 상황은 MVC 및 에 호스팅 된이 WCF 서비스를 호출하는 서버가있다. WCF 서비스는 SignalR 허브가 Java 스크립트 – PrinceT

+0

의 메서드를 호출 할 때 사용하는 뷰에서 HTML 출력을 요구하므로 HttpClient 기술이 해당 상황에서 작동해야합니다. –

관련 문제