在MVC视图中使用MVC控制器将数据传递给ng-repeat(初学者)

本文关键字:MVC ng-repeat 初学者 视图 控制器 数据 | 更新日期: 2023-09-27 18:17:53

我正在尝试使用。net MVC将SQL服务器DB连接到我的angular应用程序。我最初在Plunker (demo)上构建了应用程序,并使用了临时数据的工厂类,但现在我试图在MVC中使用真实的db数据实现它。我的问题是,我对控制器感到困惑,因为MVC本身有一个控制器以及AngularJS自己的控制器,我不确定如何连接两者。

到目前为止我得到的是:

MVC控制器(压缩)

public class TestController : Controller
{
   private MoviesEntities db = new MoviesEntities();
        public ActionResult account()
        {
            return View(db.Users.ToList().OrderBy(x => x.name));
        }
}
<<p> MVC视图/strong>
@model IEnumerable<WebApplication2.Entities.User>
@{
    ViewBag.Title = "account";
    Layout = "~/Views/Shared/_LayoutTest.cshtml";
}
@Styles.Render("/Content/style.css")
<div ng-app="app">
    <div ng-controller="AccountController">
        <input type="text" ng-model="search.$">
        <table class="table table-striped">
            <tr ng-repeat="actors in Model">
                <td>{{actors.name}}</td>
                <td>{{actors.summoner}}</td>
            </tr>
        </table>
    </div>
</div>
@Scripts.Render("~/Scripts/angular.js")
@Scripts.Render("~/Scripts/angular-route.min.js")
@Scripts.Render("~/Scripts/app.js")

现在在这一点上,我尝试添加一个引用到我的app.js文件,但没有数据显示或显示,只是一个表与{{actors.name}}和{{actors.summoner}}。我一直在搜索,并试图找到一些教程在这个基本的实现,但不能找到一个东西。如果有人能告诉我该怎么做,并解释为什么这不起作用,那就太棒了!我认为控制器的使用只是把我扔掉,我不知道如何把我的factoryapp.js变成持有数据库表值。

app.js(我现在试图实现MVC的plunker演示-> demo

var app = angular.module("app", ['ngRoute']);
app.config(function ($routeProvider) {
    $routeProvider
    .when('/', {
        templateUrl: 'pages/home.html',
        controller: 'HomeController'
    })
    .when('/home', {
        templateUrl: 'pages/home.html',
        controller: 'HomeController'
    })
    .when('/login', {
        templateUrl: 'pages/login.html',
        controller: 'LoginController'
    })
    .when('/account', {
        templateUrl: 'pages/account.html',
        controller: 'AccountController'
    })
    .when('/unknown', {
        templateUrl: 'pages/unknown.html',
        controller: 'UnknownController'
    })
      .otherwise({
          redirectTo: '/unknown'
      });
});

app.factory('userService', function () {
    return {
        users: [{
            name: "John",
            password: "12345",
            email: "johnny@gmail.com",
            phone: "238-491-2138"
        }, {
            name: "Austin",
            password: "intern",
            email: "aanderson@gmail.com",
            phone: "138-490-1251"
        }, {
            name: "Sally",
            password: "noob",
            email: "Sally123@gmail.com",
            phone: "243-421-0738"
        }, {
            name: "Bilbo",
            password: "Baggins",
            email: "oneRing@gmail.com",
            phone: "158-491-2138"
        }, {
            name: "Marco",
            password: "Wafflez",
            email: "waffleLord@gmail.com",
            phone: "935-491-2654"
        }, {
            name: "Sam",
            password: "Adams",
            email: "beeeeeer@gmail.com",
            phone: "743-491-2131"
        }, {
            name: "Willy",
            password: "W0nk4",
            email: "w0nkaz@gmail.com",
            phone: "682-491-2983"
        }]
    };
});
app.controller('LoginController', function ($scope, $location, userService, $timeout) {
    $scope.credentials = {
        username: "",
        password: ""
    };
    $scope.credentialsR = {
        username: "",
        password: ""
    };
    $scope.login = function () {
        for (var i = 0; i < userService.users.length; i++) {
            if (userService.users[i].name.toLowerCase() === $scope.credentials.username.toLowerCase()) {
                if (userService.users[i].password === $scope.credentials.password) {
                    $scope.messageLogin = "Success!";
                    $timeout(function () {
                        $timeout(function () {
                            $location.path("/home");
                        }, 500)
                        $scope.messageLogin = "Redirecting...";
                    }, 500)
                } else {
                    $scope.messageLogin = "Incorrect login details";
                }
                return;
            }
        }
        $scope.messageLogin = "Username does not exist";
    };
    $scope.checkName = function () {
        for (var i = 0; i < userService.users.length; i++) {
            if (userService.users[i].name.toLowerCase() === $scope.credentialsR.username.toLowerCase()) {
                $scope.messageRegister = "Taken";
                return;
            }
        }
        $scope.messageRegister = "Available";
    };
});
app.controller('HomeController', function ($scope) {
    $scope.title = "Home";
});
app.controller('AccountController', function ($scope, userService, $resource) {
    var Users = $resource('/Test/')
    $scope.userList = userService.users;
});
app.controller('UnknownController', function ($scope) {
});

我也使用NuGet来安装AngularJS,所以我相信在底部引用angular.js也应该很好。

ngRepeat和Filtering Data

开始构建这个布局

当前错误(s)

Error: [$injector:unpr] Unknown provider: $resourceProvider <- $resource
http://errors.angularjs.org/1.2.21/$injector/unpr?p0=%24resourceProvider%20%3C-%20%24resource
    at http://localhost:56087/Scripts/angular.js:78:12
    at http://localhost:56087/Scripts/angular.js:3776:19
    at Object.getService [as get] (http://localhost:56087/Scripts/angular.js:3904:39)
    at http://localhost:56087/Scripts/angular.js:3781:45
    at getService (http://localhost:56087/Scripts/angular.js:3904:39)
    at invoke (http://localhost:56087/Scripts/angular.js:3931:13)
    at Object.instantiate (http://localhost:56087/Scripts/angular.js:3951:23)
    at http://localhost:56087/Scripts/angular.js:7244:28
    at http://localhost:56087/Scripts/angular.js:6635:34
    at forEach (http://localhost:56087/Scripts/angular.js:332:20) 

在MVC视图中使用MVC控制器将数据传递给ng-repeat(初学者)

您需要在angular.js之后包含angular-route.min.jsangular-route.js。如果您的Scripts文件夹中没有,请检查NuGet

也可以尝试使用angular-resource.js Documentation

ngResource模块通过$resource服务为RESTful服务提供交互支持。

View

@Scripts.Render("~/Scripts/angular.js")
@Scripts.Render("~/Scripts/angular-route.js")
@Scripts.Render("~/Scripts/angular-resource.js")
@Scripts.Render("~/Scripts/app.js")

你还需要修改你的模块声明,包括ngResource:

var app = angular.module("app", ['ngRoute','ngResource']);

当我试图在Angular中使用数据时,我有一个WEB API服务作为数据提供者。然后在我的角控制器中做一个get调用。

例如,在你的情况下,而不是返回数据在你的ActionResult,有一个webapi控制器:

public HttpResponseMessage Get()
{
    using(MoviesEntities db = new MoviesEntities())
    {
        var result = db.Users.OrderBy(x => x.name).Select(x=>new{x.name,x.summoner}).ToList();
        HttpResponseMessage msg = new HttpResponseMessage();
        msg.Content = new ObjectContent<object>(result, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

        msg.StatusCode = HttpStatusCode.OK;
        return msg;
    }
}

然后在你的Angular控制器中调用该服务并填充$scope:

app.controller('AccountController', function ($scope, userService, $resource, $http) {
    $scope.getUsers = function () {
        $http({
            url: '/api/APITest',
            method: "GET"
        })
        .then(function (result) {
            $scope.userList = angular.copy(result.data);
        })
    }
    getUsers();
});

你的View也需要一些改变。使用userList代替Model。可能您想将actors重命名为actor甚至user,因为这会更有意义:

<table class="table table-striped">
    <tr ng-repeat="actors in userList">
        <td>{{actors.name}}</td>
        <td>{{actors.summoner}}</td>
    </tr>
</table>

一个建议:创建一个_AngularLayout并在那里添加脚本声明。然后将它用于你的angular启用视图。这样,您就不必在每个视图中定义它们。