在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}}。我一直在搜索,并试图找到一些教程在这个基本的实现,但不能找到一个东西。如果有人能告诉我该怎么做,并解释为什么这不起作用,那就太棒了!我认为控制器的使用只是把我扔掉,我不知道如何把我的factory
在app.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)
您需要在angular.js
之后包含angular-route.min.js
或angular-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启用视图。这样,您就不必在每个视图中定义它们。