在开发Web应用程序时,经常需要将前端界面与后端数据库进行交互。随着技术的发展,出现了许多新的框架和工具,使得这一过程变得更加简单和高效。本文将通过一个示例项目,详细解释如何使用MVC、AngularJS和Web API技术组合来实现数据库的更新操作。
首先,需要在Visual Studio中创建一个MVC网站。MVC(Model-View-Controller)是一种设计模式,用于将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),以实现关注点分离。
接下来,需要创建一个数据库,并在其中添加一个名为“Question”的表,该表包含两个字段:QuestionId和QuestionText。然后,需要使用Entity Framework创建一个.edmx文件,并为数据库上下文定义一个名为DBcontext的类。生成Entity Framework类后,Question模型类将如下所示:
public partial class Question
{
public int QuestionId { get; set; }
public string QuestionText { get; set; }
}
在项目中添加一个Web API控制器,并创建以下动作方法:GetQuestion()、AddQuestion()和UpdateQuestion()。这些方法将与数据库交互,并返回JsonResult。此外,还有一个名为QuestionAdmin()的动作方法,它调用视图并触发UI。控制器类代码如下所示:
public class QAdminController : Controller
{
// 创建Entity Framework数据库上下文对象
DatabaseConnection DBcontext = new DatabaseConnection();
// 调用视图以在UI中显示记录
public ActionResult QuestionAdmin() {
return View();
}
// 获取问题
public JsonResult GetQuestion() {
var questions = (
from q in DBcontext.Questions
select new Question { QuestionId = q.QuestionId, QuestionText = q.QuestionText }
).ToList();
return Json(questions, JsonRequestBehavior.AllowGet);
}
// 插入问题
public Question AddQuestion(Question question) {
DBcontext.Questions.Add(question);
DBcontext.SaveChanges();
Question newQuestion = new Question();
newQuestion.QuestionId = question.QuestionId;
newQuestion.QuestionText = question.QuestionText;
return newQuestion;
}
// 更新问题
public JsonResult UpdateQuestion(Question question) {
DBcontext.SaveChanges();
return GetQuestion();
}
}
接下来,需要创建一个AngularJS脚本,该脚本将调用WebAPI动作方法。脚本代码如下所示。请注意,在添加和更新部分的代码中,可以看到对Web APIURL的调用。这些URL将在浏览器中返回JSON结果。
var app = angular.module('qAdminModule', []);
app.controller('qAdminCtrl', function($scope, $http, QuestionsService) {
$scope.questionsData = null;
QuestionsService.GetAllRecords().then(
function(d) {
$scope.questionsData = d.data;
},
function() {
alert('Error.. !!!');
}
);
// 省略其他代码...
});
最后,需要创建一个视图页面,用于显示UI。在该页面中,将创建过滤控件,并使用'ng-repeat' Angular属性以表格格式显示数据。如果点击标题,将进行排序。
<asp:Content ID="Content3" runat="server">
<!-- 添加angular.min.js到项目文件夹并指定路径 -->
<script src="../../Common/angular.min.js"></script>
<script src="../../Scripts/QuestionAdmin.js"></script>
<div ng-app="qAdminModule" id="body">
<div ng-controller="qAdminCtrl">
<!-- 创建过滤UI以搜索结果 -->
<label for="QuestionId">QuestionId:</label>
<input type="text" ng-model="searchQuestionId" style="width:100px">
<label for="QuestionText">Question:</label>
<input type="text" ng-model="searchQuestion" style="width:600px">
<!-- 添加记录 -->
<a ng-click="createNew = !createNew">Create New</a>
<table ng-show="createNew">
<tr>
<td>
<label for="QuestionId">QuestionId</label>
</td>
<td>
<input type="text" data-ng-model="Question.QuestionId" style="width:50px"/>
</td>
</tr>
<tr>
<td>
<label for="QuestionText">Question</label>
</td>
<td>
<input type="text" data-ng-model="Question.QuestionText" style="width:500px"/>
</td>
</tr>
<tr>
<td>
<button data-ng-click="save()" style="width:100px">Save</button>
</td>
<td>
<button data-ng-click="clear()" style="width:100px">Clear</button>
</td>
</tr>
</table>
<br/>
<!-- 表格显示行 -->
<table class="grid" style="border-collapse:collapse;">
<th ng-click="sortType = 'QuestionId' ; sortReverse = !sortReverse">ID</th>
<th ng-click="sortType = 'QuestionText' ; sortReverse = !sortReverse" style="width:500px">Question Text</th>
<tr ng-repeat="items in questionsData | orderBy:sortType:sortReverse | filter: { QuestionText : searchQuestion}" style="white-space: nowrap;">
<td>{{items.EPPQuestionId}}</td>
<td>{{items.QuestionText}}</td>
</tr>
</table>
</div>
</div>
</asp:Content>