Angular模板和.NET Partial Postback

时间:2014-09-03 08:55:03

标签: c# javascript asp.net angularjs partial-postback

我无法使用.Net部分回发来处理角色。

问题与此基本相同:Re-initialize Angular bindings after partial postback

基本上我有一个标签,我有一个角度应用程序,然后我有第二个标签与一些c#控件,我必须在标签之间进行部分回发,当我回到我的应用程序,没有什么。

我尝试使用ngView进行路由然后我尝试了$route.reload()(它进入控制器,我可以看到模板被拉下来,但页面上的结果是无)。然后我按照here提到compile(templateCache.get(lazyTableControllerRoute.current.templateUrl))(scope)。什么都没有。

请帮助:)

每次回发后我都会在页面上显示这个html:

LiteralControl lazyControl = new LiteralControl("<div ng-app=\"LazyLoadingApp\" style=\"padding:10px\" ng-controller=\"LazyTableController\" ng-view><lazy-table> </lazy-table></div>");
Controls.Add(lazyControl);

还有一些配置常量,如templateUrl

这是我的代码:

var app = angular.module('LazyLoadingApp', ['ui.bootstrap', 'ngRoute'], function ($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
});

app.config(function ($routeProvider, $locationProvider, tableTemplateUrl) {
    $routeProvider.when('/Page.Web.UI/sptl_project.aspx', {
        controller: 'LazyTableController',
        templateUrl: tableTemplateUrl,
    });

    // configure html5 to get links working on jsfiddle
    $locationProvider.html5Mode(true);
});

//**This objects I am using after partial postback to check in the console if e.g. $route.reload() works..**
var lazyTableControllerRoute = null;
var templateCache = null;
var compile = null;
var scope = null;

app.directive('lazyTable', ['tableTemplateUrl',

    function (tableTemplateUrl) {
        return {
            name: 'lazyTable',
            priority: 0,
            restrict: 'E', // E = Element, A = Attribute, C = Class, M = Comment
            templateUrl: tableTemplateUrl
        };
    }
]).controller('LazyTableController', ['$scope', '$rootScope', 'lazyFactory', 'opsPerRequest', 'header', '$route', '$templateCache', '$compile',

    function ($scope, $rootScope, lazyFactory, opsPerRequest, header, $route, $templateCache, $compile) {

        lazyTableControllerRoute = $route;
        var loadingPromise = null;
        templateCache = $templateCache;
        compile = $compile;
        scope = $scope;

(...) rest is not important 

更新

我正在尝试使用require.js ..(再次,它在整页加载后工作。)我的想法是在部分回发后引导元素。 我构建了一个简单的测试用例,在Update Panel和我的应用程序中有一个简单的按钮,只是进行部分回发。点击后(当应用程序消失时)我在控制台中尝试了:

angular.bootstrap(document, ['LazyLoadingApp'])

但后来我收到了一些我无法删除的错误:

App Already Bootstrapped with this Element 'document'

以适用于require.js方式的应用plunker(但请注意,它仅用于代码审核目的..)

3 个答案:

答案 0 :(得分:0)

  • 不要同时使用ng-app和angular.bootstrap。
  • 你编译了#34; ng-app&#34;,如果不是这样的话。

ngtutorial.com/learn/bootstrap

答案 1 :(得分:0)

好吧!问题解决了..所以为了处理部分回发你需要:

像这样定义app :(记住你必须从html中删除ng-app!)

<base href="/">
<asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
         <asp:Button ID="fire" runat="server" Text="fire!" />
            <div id="parent" >  <div id="boodstapped" ng-view ></div></div>

    </ContentTemplate>
</asp:UpdatePanel>

像这样实例化应用:

var app = angular.module('LazyLoadingApp', ['ui.bootstrap', 'ngRoute']);
jQuery(document).ready(function ($) {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    function EndRequestHandler(sender, args) {
        jQuery('#parent').children().remove();
        jQuery('#parent').append('<div id="boodstapped" ng-view ></div>');
        angular.bootstrap(jQuery('#boodstapped'), ['LazyLoadingApp']);
    }
    prm.add_endRequest(EndRequestHandler);
});

然后,当您尝试进行部分回发时,EndRequestHandler将再次引导应用程序。删除以前的bootstrap元素是非常重要的,以避免角度已经引导&#34;错误。

点击Here了解详情。

答案 2 :(得分:0)

虽然其他答案可能确实有用,但我发现最好的做法是尽量不要混在一起。 .net控件和角度控件的状态取决于两者之间的交互。

这个过程最多没有记录......你最终会编写大量代码来处理简单的事情。

我不建议长时间执行以下操作,只建议将其作为临时/过渡解决方案,我知道这可能无法解决所有情况....但请注意,您始终可以从点攻击此问题。网络方面如下,并重定向回您所在的页面...

      protected void cbChecked_My_DotNet_CallBack(object sender, EventArgs e)
        {
             DoDotNetStuff();
             if(NeedToSignalToAngular){
                   response.redirect(yourpage.aspx?yourparams=xxx)     
             }
         }