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>
귀하의 질문에 혼란스러워합니다 : wcf 서비스를 사용하여 html 파일을 제공하고 있습니까, 특별히 면도기를 사용하고 있습니까? –
보기 코드가 어딘가에서 날아 와야합니다. 그것을 디버그하고 당신에게 단서를 줄 수있는 내부 예외를 찾을 수 있습니까? –
내부 예외가 없습니다. 네, WCF 서비스를 사용하여 HTML 파일을 제공하고 있습니다. – PrinceT