2

현재 ASP.NET MVC 프로젝트에서 작업 중입니다. 웹 응용 프로그램의 사이트는 부트 스트랩으로 생성됩니다. 나중에 다른 언어로 페이지를 번역 할 수 있도록 AngularJS 스크립트를 추가했습니다. 모든 페이지에서 잘 작동하지만 부분 뷰가 페이지에서로드 된 경우에는 그렇지 않습니다. 예를 들어 이름 또는 호스트 이름별로 롤아웃 객체를 검색 할 페이지가 있습니다. 이 페이지에서 중괄호로 된 모든 각도 표현식은 올바르게 평가되고 변환 스크립트를 사용하여 여러 언어로 된 문자열로 대체됩니다. 이제 세 가지 속성 중 하나를 사용하여 개체를 필터링하면 해당 페이지의 부분보기가로드되어 검색 결과를 보여줍니다. 여기서는 평가되지 않은 각도 표현을 사용하며 표현 자체 만 보여줍니다. 여기 AngularJS가 MVC 부분 뷰에서 작동하지 않습니다.

는 제대로 작동하는 페이지입니다 :

@{ 
 
    ViewBag.Title = "{{ 'ROLLOUT-OBJECT_MANAGEMENT.TITLE' | translate }}"; 
 
} 
 

 
<!-- html --> 
 
<div style="font-size: 20px; margin-top: 20px; margin-bottom: 20px;"> 
 
    <div class="gray-background list-group-item" translate="{{'ROLLOUT-OBJECT_MANAGEMENT.TITLE'}}"></div> 
 
</div> 
 
<div class="list-group"> 
 

 
    <div class="gray-background list-group-item"> 
 
     <div class="row margin-bottom"> 
 
      <div class="col-md-3"> 
 
       <h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.FIRST_NAME'}}"></h6> 
 
      </div> 
 
      <div class="col-md-3"> 
 
       <h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.SURNAME'}}"></h6> 
 
      </div> 
 
      <div class="col-md-3"> 
 
       <h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.HOST_NAME'}}"></h6> 
 
      </div> 
 
     </div> 
 
     <div class="row margin-bottom"> 
 
      <div class="col-md-3"> 
 
       <!-- referenced in getPartial() --> 
 
       <input type="text" class="form-control" id="iFirstName" name="iFirstName" placeholder=""> 
 
      </div> 
 
      <div class="col-md-3"> 
 
       <!-- referenced in getPartial() --> 
 
       <input type="text" class="form-control" id="iSurName" name="iSurName" placeholder=""> 
 
      </div> 
 
      <div class="col-md-3"> 
 
       <!-- referenced in getPartial() --> 
 
       <input type="text" class="form-control" id="iHostName" name="iHostName" placeholder=""> 
 
      </div> 
 
      <div class="col-md-3"> 
 
       <!-- getPartial() added to click through javascript--> 
 
       <button type="submit" class="btn btn-primary btn-block" id="iButton"><span translate="{{'ROLLOUT-OBJECT_MANAGEMENT.BUTTON_SEARCH'}}"></span><span class="white-color glyphicon glyphicon-search"></span></button> 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div> 
 
<div class="list-group"> 
 
    <div class="gray-background list-group-item"> 
 
     <h5><span translate="{{'ROLLOUT-OBJECT_MANAGEMENT.RESULTS'}}"></span><span class="purple-color glyphicon glyphicon-globe"></span></h5> 
 
    </div> 
 
    <!-- referenced in getPartial() --> 
 
    <div class="gray-background list-group-item"> 
 

 
     <div class="row"> 
 
      <div class="col-md-12" id="partialViewContainer"> 
 
       @{Html.RenderPartial("_RolloutObjectManagementResultsPartial");} 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div> 
 

 

 
<!-- layout --> 
 
@Styles.Render(
 
    "~/content/chosen/chosen.css", 
 
    "~/content/chosen/prism.css", 
 
    "~/content/chosen/style.css", 
 
    "~/content/bootstrap.css", 
 
    "~/content/Site.css") 
 

 
<!-- javascript --> 
 
<script src="~/Scripts/jquery-1.10.2.min.js"></script> 
 
<script src="~/Scripts/chosen/chosen.jquery.js"></script> 
 
<script src="~/Scripts/chosen/prism.js"></script> 
 
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script> 
 
<script> 
 
    var config = { 
 
     '.chosen-select': {}, 
 
     '.chosen-select-deselect': { allow_single_deselect: true }, 
 
     '.chosen-select-no-single': { disable_search_threshold: 10 }, 
 
     '.chosen-select-no-results': { no_results_text: 'Oops, nothing found!' }, 
 
     '.chosen-select-width': { width: "95%" } 
 
    } 
 
    for (var selector in config) { 
 
     $(selector).chosen(config[selector]); 
 
    } 
 
</script> 
 
<script> 
 
    //add functionality to button 
 
    $('#iButton').click(function() { 
 
     getPartial('0'); 
 
    }); 
 
</script> 
 
<script> 
 
    function previous() { 
 
     var temp = document.getElementById("hPage").value; 
 
     //alert(temp);//debug 
 
     if (temp > 0) { 
 
      temp = --temp; 
 
     } 
 
     getPartial(temp); 
 
    } 
 
    function next() { 
 
     var temp = document.getElementById("hPage").value; 
 
     //alert(temp);//debug 
 
     temp = ++temp; 
 
     getPartial(temp); 
 
    } 
 
</script> 
 
<script> 
 
    function getPartial(newPage) { 
 
     //get search values 
 
     var tempFirst = document.getElementById("iFirstName"); 
 
     var tempSur = document.getElementById("iSurName"); 
 
     var tempHost = document.getElementById("iHostName"); 
 
     var firstResult = tempFirst.value; 
 
     var surResult = tempSur.value; 
 
     var hostResult = tempHost.value; 
 
     //ajax call 
 
     $.ajax({ 
 
      url: "_RolloutObjectManagementResultsPartial", 
 
      type: "POST", 
 
      data: { firstName: firstResult, surName: surResult, hostName: hostResult, page: newPage, count: 10 }, 
 
      dataType: "html", 
 
      error: function (xhr) { 
 
       //alert(xhr.responseText);//debug 
 
      }, 
 
      success: function (result) { 
 
       $("#partialViewContainer").html(result).find("select").each(function() { 
 
        $(this).chosen({}); 
 
       }) 
 
      }, 
 
      complete: function() { 
 
       //alert("everything worked");//debug 
 
      } 
 
     }); 
 
    } 
 
</script>

그리고 여기 그것이 작동하지 않는 부분보기 (중요한 것은 표현식이다에서 {{...} } :

<!-- Import needed namespaces --> 
 
@using RolloutTool.BusinessLayer.Foundation 
 
@using RolloutTool.Utility 
 

 
<!-- Initializing needed variables --> 
 
@{ 
 
    List<RolloutObject> RolloutObjects = ViewContext.Controller.ViewBag.RolloutObjects; 
 
    List<Cluster> Clusters = ViewContext.Controller.ViewBag.Clusters; 
 
    string name = ""; 
 
    int count = 0; 
 
    string rowID = ""; 
 
    int page = 0; 
 
    if (ViewContext.Controller.ViewBag.Page != null) 
 
    { 
 
     page = ViewContext.Controller.ViewBag.Page; 
 
    } 
 
} 
 

 
<!-- html elements --> 
 
<div class="row"> 
 
    <div class="col-md-12"> 
 
     <table class="table"> 
 
      <thead> 
 
       <tr> 
 
        <th style="width:25%"><h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.EMPLOYEE'}}"></h6></th> 
 
        <th style="width:20%"><h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.WORK_STATION'}}"></h6></th> 
 
        <th class="text-center" style="width:15%"><h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.EDIT'}}"></h6></th> 
 
        <th class="text-center" style="width:25%"><h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.CLUSTER'}}"></h6></th> 
 
        <th class="text-center" style="width:15%"><h6 translate="{{'ROLLOUT-OBJECT_MANAGEMENT.ASSIGN'}}"></h6></th> 
 
       </tr> 
 
      </thead> 
 
      <tbody> 
 
       <!-- creating all RolloutObject Table rows --> 
 
       @foreach (RolloutObject ro in RolloutObjects) 
 
       { 
 
         <!-- generating rowID --> 
 
        rowID = "row" + Convert.ToString(count); 
 
        count++; 
 
         <!-- generating the full employee name --> 
 
        name = Functions.TryGetValue(ro.Employee.FirstName) + " " + Functions.TryGetValue(ro.Employee.SecondName) + " " + Functions.TryGetValue(ro.Employee.Name); 
 
        <tr id="@rowID"> 
 
         <td>@name</td> 
 
         <td id="@Convert.ToString(rowID + "_hn")">@Convert.ToString(Functions.TryGetValue(ro.Hostname))</td> 
 
         <!-- generate link to right rolloutobjectedit --> 
 
         <td class="text-center"><a href="#"><span class="btn-pencil glyphicon glyphicon-pencil blue-color glyph-hov" onclick="location.href='@Url.Action("RolloutObjectEdit", "RolloutObject", new {hostName = ro.Hostname })'"></span></a></td> 
 
         <!-- generating the link for cluster addition and populating cluster dropdown --> 
 
         <td class="text-center"> 
 
          <div class="row"> 
 
           <div class="col-sm-12"> 
 
            <select class="chosen-select no-margin" style="width:100%" id="@Convert.ToString(rowID + "_cl")" name="iCluster" data-placeholder="Cluster"> 
 
             @if (ro.Cluster != null) 
 
             { 
 
              <option selected>@Convert.ToString(Functions.TryGetValue(ro.Cluster.Name))</option> 
 
             } 
 
             else 
 
             { 
 
              <option></option> 
 
             } 
 
             @foreach (Cluster cluster in Clusters) 
 
             { 
 
              <option>@Convert.ToString(Functions.TryGetValue(cluster.Name))</option> 
 
             } 
 
            </select> 
 
           </div> 
 
          </div> 
 
         </td> 
 
         <td class="text-center"><span class="btn-ok glyphicon glyphicon-ok green-color glyph-hov" onclick="callAjax('@rowID')" /></td> 
 
        </tr> 
 
       } 
 
      </tbody> 
 
     </table> 
 
    </div> 
 
</div> 
 

 
<div class="row"> 
 
    <div class="col-md-12"> 
 
     <input class="hidden" id="hPage" value="@Convert.ToString(page)" /> 
 
     <nav> 
 
      <ul class="pager"> 
 
       <li class="pull-left"><a class="btn-paging glyphicon glyphicon-arrow-left" onclick="previous()"></a></li> 
 
       <li class="pull-right"><a class="btn-paging glyphicon glyphicon-arrow-right" onclick="next()"></a></li> 
 
      </ul> 
 
     </nav> 
 
    </div> 
 
</div> 
 

 
<!-- javascript --> 
 
<script src="~/Scripts/jquery-1.10.2.min.js"></script> 
 
<script src="~/Scripts/chosen/chosen.jquery.js"></script> 
 
<script src="~/Scripts/chosen/prism.js"></script> 
 
<script> 
 
    function callAjax(idRow) { 
 
     //get row values 
 
     var tempTD = document.getElementById(idRow + "_hn"); 
 
     var tempSelect = document.getElementById(idRow + "_cl"); 
 

 
     var tempHostName = tempTD.textContent; 
 
     var tempCluster = tempSelect.options[tempSelect.selectedIndex].text; 
 

 
     //ajax call 
 
     $.ajax({ 
 
      url: "AddToCluster", 
 
      type: "POST", 
 
      data: { clusterName: tempCluster, hostName: tempHostName }, 
 
      dataType: "html", 
 
      error: function (xhr) { 
 
       alert(xhr.responseText); 
 
      }, 
 
      success: function (result) { 
 
       
 
      }, 
 
      complete: function() { 
 
       //alert("everything worked");//debug 
 
      } 
 
     }); 
 
    } 
 
</script> 
 
<script> 
 
    function previous() { 
 
     var temp = document.getElementById("hPage").value; 
 
     //alert(temp);//debug 
 
     if (temp > 0) { 
 
      temp = --temp; 
 
     } 
 
     getPartial(temp); 
 
    } 
 
    function next() { 
 
     var temp = document.getElementById("hPage").value; 
 
     //alert(temp);//debug 
 
     temp = ++temp; 
 
     getPartial(temp); 
 
    } 
 
</script> 
 
<script> 
 
    function getPartial(newPage) { 
 
     //get search values 
 
     var tempFirst = document.getElementById("iFirstName"); 
 
     var tempSur = document.getElementById("iSurName"); 
 
     var tempHost = document.getElementById("iHostName"); 
 
     var firstResult = tempFirst.value; 
 
     var surResult = tempSur.value; 
 
     var hostResult = tempHost.value; 
 
     //ajax call 
 
     $.ajax({ 
 
      url: "_RolloutObjectManagementResultsPartial", 
 
      type: "POST", 
 
      data: { firstName: firstResult, surName: surResult, hostName: hostResult, page: newPage, count: 10 }, 
 
      dataType: "html", 
 
      error: function (xhr) { 
 
       alert(xhr.responseText); 
 
      }, 
 
      success: function (result) { 
 
       $("#partialViewContainer").html(result).find("select").each(function() { 
 
        $(this).chosen({}); 
 
       }) 
 
      }, 
 
      complete: function() { 
 
       //alert("everything worked");//debug 
 
      } 
 
     }); 
 
    } 
 
</script>

이 스크립트가 포함하고로드 된 _Layout.cshtml입니다 :

<!DOCTYPE html> 
 
<html ng-app="myApp"> 
 
<head> 
 
    <meta charset="utf-8" /> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
    <title>@ViewBag.Title - {{ 'TITLE.PROGRAM' | translate }}</title> 
 
    @Styles.Render(
 
    "~/Content/css", 
 
    "~/Content/flag-icon-css-master/assets/docs.css", 
 
    "~/Content/flag-icon-css-master/css/flag-icon.min.css", 
 
    "~/Content/Site.css") 
 
    <script src="~/Scripts/angular/angular.js"></script> 
 
    <script src="~/Scripts/angular/angular-translate.js"></script> 
 
    <script src="~/Scripts/angular/angular-cookies.min.js"></script> 
 
    <script src="~/Scripts/angular/translate.js"></script> 
 
    <script src="~/Scripts/angular/angular-route.min.js"></script> 
 
    <script src="~/Scripts/angular/angular-translate-storage-cookie.min.js"></script> 
 
    <script src="~/Scripts/angular/angular-translate-storage-local.min.js"></script>  
 
</head> 
 

 
<body ng-controller="Ctrl"> 
 
    
 
    <!-- Here is the html for the navigation bar etc. --> 
 
    
 
    @Scripts.Render("~/bundles/jquery") 
 
    @Scripts.Render("~/bundles/bootstrap") 
 
    @RenderSection("scripts", required: false) 
 
</body> 
 
</html>

내가 일부 멋진 번역 기능을 제공하기 위해 원하는대로 정말 AngularJS와에 전문가가 아니지만, 부분적인 견해에서 왜 작동하지 않는지에 관해 당신이 생각하기를 바랍니다.

+0

RenderPartial 뷰와 ng-controller에 등록한 뷰의 맨 위에 스크립트 코드를 추가해야합니다. –

+0

그러면 JavaScript AJAX 호출을 사용하여 DOM 요소를 HTML 부분으로 대체합니다 이것은 각도 표현을 포함합니다. Angular는'$ compile()'단계에서 표현식이 평가되기 때문에 표현식을 제대로 렌더링하지 못합니다. '위상'에 링크 할 템플릿을 만듭니다. 이것은 일반적으로 부트 스트랩 단계 또는 지시문 내부의 특수 함수 중에 발생합니다. – Claies

+0

Angular.js는 가능할 때마다 직접 DOM 조작을하지 않으므로 전체 프로세스를 Angular로 수행 한 경우 성취하려는 논리가 더 쉽고 코드 작성이 더 쉬워 진 것처럼 보입니다. 즉, 저는 조금 더 연구 중이며 조만간 실행 가능한 솔루션을 게시 할 것입니다. – Claies

답변

0

ng-include (" 'controller/action'")를 사용하여 부분 뷰를 호출해야합니다. 아포스트로피 (')는 URL을 쓰는 동안 중요합니다. 예

<div id="TestDiv" ng-include="templateUrl"></div> 

및 각 컨트롤러 내부

var app = angular.module("Layout", []); 
    app.controller("LoadPage", function ($scope, $http, $sce) { 

    //Initially 
    $scope.templateUrl = '/Home/DefaultPage'; 

    // To dynamically change the URL. 
    $scope.NewProjFn = function() { 
     $scope.templateUrl = '/Home/ProjectPage'; 
    }; 
}); 

당신이 그것을 다시 구현하는 것이 아니라 전혀 어려울 수 있지만 사용하여

당신은 또한하지 필요가 NG를-포함 아약스 전화를 걸자. 그것은 아약스 호출, 컴파일 및 디스플레이를 포함하는 모든 것을 자체적으로 수행합니다. 그러나 ng-click 및 기타 이벤트와 같은 기능은 한 번 컴파일 과정으로 작동하지 않습니다.

관련 문제