ASP。NET MVC警告横幅使用Bootstrap和AngularUI Bootstrap
- Watch this script in action - demo
- 下载Source Code from GitHub
- 下载Source Code from CodeProject (1.1 MB)
表的内容 介绍视图视图操作web api ok按钮单击ok按钮动作方法requireacceptpolicy——自定义授权过滤器属性过滤器配置ajax验证种防伪标记视图使用AngularJS可重用的模式使用jQuery和引导可重用的模式使用AngularJS和AngularUI引导未来行动计划结论历史看这个脚本下载资源 介绍 在本文中,作者将分享如何使用ASP实现警告标志和可重用模式。NET MVC, jQuery, Web API, Bootstrap, AngularJS和AngularUI Bootstrap。有些人将警告横幅称为免责横幅、同意画面、启动画面、系统可接受使用策略、登录警告横幅、登录策略、登录横幅、登录通知等。基本上,这是用户第一次访问或登录到应用程序时显示的页面/通知。以下是读者可以从本文中摘录的内容的摘要。 如何创建警告标语使用jQuery +引导如何创建警告标语使用AngularJS + AngularUI引导如何创建一个简单的Web API如何从MVC控制器调用Web API包括种防伪标记到AJAX POST请求如何使用MVC局部视图创建可重用的模态和jQuery +引导如何创建可重用的模式使用AngularJS模板+ AngularUI引导如何创建一个授权过滤器吗 图1显示了该解决方案包含两个项目,分别是CommonApp和WarningBanner。CommonApp是一个简单的WebAPI项目,负责返回警告横幅内容。 图1 警告标语视图 清单1显示了WarningPage视图中的引导模态标记。在这个例子中,modal-body的内容将从ViewBag中读取。您可以将其更改为从模型绑定,或者根据您的需求将横幅内容硬编码到页面上。数据键盘设置为“false”,以防止用户按键盘上的ESC键关闭警告横幅。 清单1 隐藏,复制Code
@{ Html.RenderPartial("~/Views/Shared/_AntiforgeryToken.cshtml"); }
<divclass="modal fade"id="myModal"role="dialog"data-keyboard="false"data-backdrop="static">
<divclass="modal-dialog">
<divclass="modal-content">
<divclass="modal-header">
<buttontype="button"class="close"data-dismiss="modal">×</button>
</div>
@if (ViewBag.SystemWarningMessage != null)
{
<divclass="modal-body"> @Html.Raw(ViewBag.SystemWarningMessage)</div>
}
<divclass="modal-footer">
<buttontype="button"class="btn btn-default"id="btnAcceptPolicy"data-dismiss="modal">OK</button>
</div>
</div>
</div>
</div>
警告横幅视图行动 在页面加载时,WarningPage操作方法将检查用户是否单击了警告横幅页面上的OK按钮。如果是,则将请求重定向到主页,否则将获得警告横幅消息并显示在页面上。 清单2 隐藏,复制Code
public ActionResult WarningPage()
{
if (Session["SessionOKClick"] != null)
{
return RedirectToAction("Index");
}
SetWarningBanner();
return View();
}
清单3显示了设置警告横幅内容的代码。在本例中,该方法通过HttpClient类从Web API获取内容。代码非常简单,但是,我们可以在这里做一些改进。可以修改代码,从配置文件中读取Web API URI,并在将JSON结果返回给客户端之前对其进行消毒。如果Web API不是首选,那么我们可以修改代码来读取数据库/实体、配置文件甚至是硬编码的内容。此方法中cache-control标头的目的是防止浏览器后退按钮从缓存中提供内容。例如,如果用户在接受策略后单击浏览器的back按钮,警告横幅模式将重新出现,并提示用户再次接受策略。 清单3 隐藏,复制Code
internal void SetWarningBanner()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
//Content can be from the database/Entity, Web Services, hardcode here
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:47503");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync("api/warningbanner/1").Result;
if (response.IsSuccessStatusCode)
{
string responseString = response.Content.ReadAsStringAsync().Result;
JObject json = JObject.Parse(responseString);
//you can update the code to sanitize the json output here
ViewBag.SystemWarningMessage = json["Content"].ToString();
}
}
}
警告标语Web API 清单4显示了警告横幅web API控制器的内容。这个类包含一个WarningBanner对象,其中包含一些示例数据,以及一个Get方法来通过id检索WarningBanner。同样,可以随意修改这个代码来从数据库/实体、配置文件等中读取数据。 清单4 隐藏,复制Code
public class WarningBannerController : ApiController
{
//sample data
IList<WarningBanner> warningBanners = new List<WarningBanner>
{
new WarningBanner { Id = 1, Content = "<b> *** Warning Banner Content 1 ****</b>",
LastUpdatedDate = DateTime.Now},
new WarningBanner { Id = 2, Content = "<b> *** Warning Banner Content 2 ****</b>",
LastUpdatedDate= DateTime.Now.AddDays(-30)}
};
public IHttpActionResult Get(int id)
{
var banner = warningBanners.FirstOrDefault((p) => p.Id == id);
if (banner == null)
{
return NotFound();
}
return Ok(banner);
}
}
警告横幅视图OK按钮单击 清单5显示了在单击Ok按钮时将触发Ajax调用以post到Home/AcceptPolicy方法。在本例中,post将包括一个防伪造标记和一个键值对数据。如果请求成功,请求将被重定向到最初请求的页面。 清单5 隐藏,复制Code
<scripttype="text/javascript">
$(window).load(function () {
$('#myModal').modal('show');
});
jQuery(document).ready(function () {
jQuery("#btnAcceptPolicy").click(function () {
jQuery.ajax({
type: "POST",
url: '@Url.Content("~/Home/AcceptPolicy")',
data: { rURL: 'someDummyValue' },
beforeSend: function (xhr) { xhr.setRequestHeader('RequestVerificationToken', $("#antiForgeryToken").val()); },
success: function (data) {
window.location.href = data;
}
});
});
});
</script>
警告横幅OK按钮操作方法 AcceptPolicy动作方法正在用HttpPost和AjaxValidateAntiForgeryToken属性进行修饰。此方法的主要目的是在用户单击Ok按钮之后,告诉客户端将请求重定向到哪个URL。请参见清单6。您还可以创造性地添加额外的逻辑,将用户响应记录到数据库中。该方法接受一个参数rURL,该变量没有被代码使用。目的是演示AJAX post可以向动作方法传递参数。SessionOKClick会话变量的目的是跟踪用户是否单击了Ok按钮。另一方面,SessionReturnUrl会话变量包含初始页面请求的URL。URL在AuthorizeAttribute处设置。的授权方法,将在下一节中讨论。 清单6 隐藏,复制Code
[HttpPost]
[AjaxValidateAntiForgeryToken]
public ActionResult AcceptPolicy(string rURL)
{
Session["SessionOKClick"] = "1";
string decodedUrl = string.Empty;
//return url to redirect after user accepted the policy
if (Session["SessionReturnUrl"] != null)
{
decodedUrl = Server.UrlDecode(Session["SessionReturnUrl"].ToString());
}
if (Url.IsLocalUrl(decodedUrl))
{
return Json(decodedUrl);
}
else
{
return Json(Url.Action("Index", "Home"));
}
}
自定义授权过滤器attribute 清单7显示了自定义授权筛选器,用于检查在授权用户调用操作方法之前是否需要将请求重定向到警告横幅页面。在本例中,OnAuthorization方法只包含处理警告横幅策略的逻辑。实际上,您的应用程序可能有其他逻辑来验证已授权用户。我们可以将清单7中的代码追加/合并到应用程序授权过滤器类中。PageToSkipPolicyNotification和PageToShowPolicyNotification方法分别允许指定某些页以跳过或显示警告横幅页。如果出现以下情况,OnAuthorization方法将请求重定向到警告页面 操作不是从Ok按钮点击(AcceptPolicy)和用户必须接受策略之前,查看请求页面和用户没有点击Ok按钮(AcceptPolicy)之前 回想一下,SessionOKClick会话变量是在WarningPage AcceptPolicy操作方法中设置的。SessionReturnUrl会话变量的目的是保存请求的URL。我们不能期望所有用户都通过/主页进入web应用程序,有些用户可能会从/home/联系页面、/home/about页面等等进入。Let表示用户最初从/home/contact页面输入web应用程序。用户单击警告页面上的Ok按钮(AcceptPolicy)后,请求将被重定向到/home/contact页面。如果你想看到带有AngularJS的警告横幅,在web的appSettings元素中。配置时,将WaningBannerAngular的值设置为1。 清单7 隐藏,收缩,复制Code
public class RequireAcceptPolicy : AuthorizeAttribute, IAuthorizationFilter
{
internal static bool PageToSkipPolicyNotification(HttpContext ctx)
{
string[] pagesToExclude = { "/home/testwarningpage", "/home/warningpage"};
string pageToCheck = ctx.Request.Path.ToString().ToLower().TrimEnd('/');
return pagesToExclude.Contains(pageToCheck) ? true : false;
}
internal static bool PageToShowPolicyNotification(HttpContext ctx){ ….}
public override void OnAuthorization(AuthorizationContext filterContext)
{
//Other Authorization logic ….
….
//don't prompt if the action is from acceptpolicy, and pages to exclude and SessionOKClick != null (user already accepted policy)
if (!filterContext.ActionDescriptor.ActionName.ToLower().Contains("acceptpolicy") && !PageToSkipPolicyNotification(HttpContext.Current) &&
HttpContext.Current.Session["SessionOKClick"] == null)
{
//track the request url, include the query string
HttpContext.Current.Session["SessionReturnUrl"] = filterContext.HttpContext.Request.Url.PathAndQuery;
//redirect to policy page
if (System.Configuration.ConfigurationManager.AppSettings["WaningBannerAngular"] == "1")
{
filterContext.Result = new RedirectResult("~/home/WarningPageNg");
}
else
{
filterContext.Result = new RedirectResult("~/home/WarningPage");
}
}
}
}
过滤器配置 清单8展示了如何将自定义授权筛选器属性RequireAcceptPolicy添加到全局筛选器集合中。 清单8 隐藏,复制Code
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new RequireAcceptPolicy());
}
}
Ajax验证防伪令牌 防伪造令牌代码是使用Ajax Post将防伪造令牌传递给MVC动作。不是将与客户机相关的代码放在每个页面上,而是将代码放在部分视图_AntiforgeryToken.cshtml中。您可以将需要防伪造标记的部分视图放置到单个页面或布局页面中。清单9显示了_AntiforgeryToken.cshtml的内容。部分视图由两个隐藏字段组成,分别为ID antiForgeryToken和antiForgeryTokenNg。隐藏字段保存由GetAntiForgeryToken方法生成的防伪标记。角锥器利用了抗伪造记号的隐域。 清单9 隐藏,复制Code
@functions{
public string GetAntiForgeryToken()
{
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + "," + formToken;
}
}
<inputtype="hidden"id="antiForgeryToken"value="@GetAntiForgeryToken()"/>
<inputid="antiForgeryTokenNg"data-ng-model="antiForgeryToken"type="hidden"data-ng-init="antiForgeryToken='@GetAntiForgeryToken()'"/>
清单10展示了jQuery AJAX post如何将防伪造令牌传递给控制器动作方法。您可以从清单5中看到完整的JavaScript。 清单10 隐藏,复制Code
beforeSend: function (xhr) { xhr.setRequestHeader('RequestVerificationToken', $("#antiForgeryToken").val()); }
清单11简要展示了AngularJS如何将防伪造令牌传递给控制器动作方法。请下载源代码,因为我可能会跳过这一节中的一些内容。在页面加载时,控制器将从隐藏字段读取令牌,然后将其存储到数组变量即items中。当用户点击Accept策略/OK按钮时,AngularJS $http服务将包括报头属性发送到服务器。在本例中,头属性包含RequestVerificationToken参数和来自$scope.items[0]的值。这个例子中的数组碰巧只有一项,这就是为什么它的位置是0。 清单11 隐藏,复制Code
// modal controller
$scope.items = [$scope.antiForgeryToken];
// OK click
$http({
method: 'POST',
url: '/home/AcceptPolicy',
params: Indata,
headers: {
'RequestVerificationToken': $scope.items[0]
}
…
警告横幅视图使用AngularJS 清单12显示了WarningPageNg视图中的AngulatJS和AngularUI Bootstrap模态标记。与警告页面视图一样,模式体的内容来自ViewBag。您可以将其更改为从模型绑定,或者根据您的需求将横幅内容硬编码到页面上。模态的内容被封装在脚本指令下的模板中。单击OK按钮将被路由到OK()函数,而openModal()函数将在页面加载时被调用。 清单12 隐藏,复制Code
<divng-controller="modalcontroller">
<scripttype="text/ng-template"id="myModal.html">
<divclass="modal-header"></div>
<divclass="modal-body">
@if (ViewBag.SystemWarningMessage != null)
{
<divclass="modal-body"> @Html.Raw(ViewBag.SystemWarningMessage)</div>
}
</div>
<divclass="modal-footer">
<buttonclass="btn btn-default"type="button"ng-click="ok()">OK</button>
</div>
</script>
@{ Html.RenderPartial("~/Views/Shared/_AntiforgeryToken.cshtml"); }
<spanng-init="openModal()"></span>
</div>
@section scripts{
<scriptsrc="~/ControllersNg/ModalController.js"></script>
}
清单13显示了ModalController.js文件的内容。最初,代码将创建一个新模块TestAngularApp,并声明对ui的依赖。引导模块。然后代码将利用Config函数将$httpProvider provider注入到应用程序的模块配置块中。提供程序将允许模块向执行的调用添加“X-Requested-With”类型的头。这个头对于和AjaxValidateAntiForgeryToken属性一起工作和解决错误“required antiforgery cookie \”剩余的requestverificationtoken \“不存在”是必要的。你可以在这里看到一个AngularUI模态打开的属性和定义列表。OK按钮的单击逻辑非常类似于清单5。点击按钮,页面将发布到home/AcceptPolicy方法,带有防伪造标记。 清单13 隐藏,收缩,复制Code
var app = angular.module('TestAngularApp', ['ui.bootstrap']);
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);
app.controller('modalcontroller', function ($scope, $uibModal) {
$scope.animationsEnabled = true;
$scope.openModal = function (size) {
$scope.items = [$scope.antiForgeryToken];
var ModalInstance = $uibModal.open({
animation: $scope.animationsEnabled,
templateUrl: 'myModal.html',
controller: 'InstanceController',
backdrop: false,
resolve: {
items: function () { return $scope.items; }
}
});
};
});
app.controller('InstanceController', function ($scope, $uibModalInstance, $http, $window, items) {
$scope.items = items;
$scope.ok = function () {
var Indata = { rURL: 'dummyTestParam' };
$http({
method: 'POST',
url: '/home/AcceptPolicy',
params: Indata,
headers: {'RequestVerificationToken': $scope.items[0] }
}).then(function successCallback(response) {
$scope.status = response.status;
$scope.data = response.data;
$window.location.href = response.data;
}, function errorCallback(response) {
});
$uibModalInstance.close();
};
$scope.cancel = function () {
//it dismiss the modal
$uibModalInstance.dismiss('cancel');
};
});
使用jQuery和引导程序的可重用模式 清单14显示了t的HTML标记他_ModalDialog部分视图。在这个视图中,有用于模态对话框标题和主体的占位符和几个按钮。 清单14 隐藏,复制Code
<divclass="modal fade"id="SharedModalDialog"role="dialog"data-keyboard="false"data-backdrop="static">
<divclass="modal-dialog">
<divclass="modal-content">
<divclass="modal-header">
<buttontype="button"class="close"data-dismiss="modal">×</button>
<h4class="modal-title">[Title]</h4>
</div>
<divclass="modal-body">[Body] </div>
<divclass="modal-footer">
<buttontype="button"class="btn btn-default"id="SharedModalDialogBtnOk"data-dismiss="modal">OK</button>
<buttontype="button"class="btn btn-default"id="SharedModalDialogBtnCancel"data-dismiss="modal">Cancel</button>
<div>
</div>
</div>
</div>
清单15显示了在_ModalDialog部分视图中显示对话框的jQuery插件ModalDialog。这个插件接受5个参数,你可以定制它来满足你的需求。与对话框标题和正文内容对应的标题和正文参数。OkButtonText和CancelButtonText参数将分别决定标签和OK和Cancel按钮的可见性。如果指定了OkClickRedirect值,在单击OK按钮时,请求将被重定向到指定的URL。 清单15 隐藏,收缩,复制Code
$(document).ready(function () {
(function ($) {
// jQuery plugin definition
$.fn.ModalDialog = function (params) {
// merge default and user parameters
params = $.extend({ title: '', body: '', OkButtonText: '', OkClickRedirect: '', CancelButtonText: '' }, params);
if (params.title != '') {
$(".modal-title").text(params.title);
}
if (params.title != '') {
$(".modal-body").html(params.body);
}
if (params.OkButtonText != '') {
$("#SharedModalDialogBtnOk").text(params.OkButtonText);
$("#SharedModalDialogBtnOk").show();
}
else {
$("#SharedModalDialogBtnOk").hide();
}
if (params.CancelButtonText != '') {
$("#SharedModalDialogBtnCancel").text(params.CancelButtonText);
$("#SharedModalDialogBtnCancel").show();
}
else {
$("#SharedModalDialogBtnCancel").hide();
}
if (params.OkClickRedirect != '') {
$("#SharedModalDialogBtnOk").click(function () {
window.location.replace(params.OkClickRedirect);
});
}
$('#SharedModalDialog').modal('show');
// allow jQuery chaining
return false;
};
})(jQuery);
});
清单16显示了如何利用新创建的部分视图和jQuery插件来显示模态对话框。RenderPartial方法可以放在布局页面中。如果应用程序需要在整个应用程序中向客户端显示一个简单的警报消息/通知,这将非常有用。清单16中有三个按钮和关于如何使用插件的示例。 清单16 隐藏,收缩,复制Code
<inputtype="button"id="btn1"value="Test Bootstrap Modal - OK button/Redirect"/>
<inputtype="button"id="btn2"value="Test Bootstrap Modal - multiple button"/>
<inputtype="button"id="btn3"value="Test Bootstrap Modal - no button"/>
@section scripts {
@{
Html.RenderPartial("~/Views/Shared/_ModalDialog.cshtml");
}
<scripttype="text/javascript">
$("#btn1").click(function () {
$('#SharedModalDialog').ModalDialog({
title: 'Test - modal',
body: '<b>Do you agree with the term?</b>',
OkButtonText: 'Accept',
OkClickRedirect: '/Home/Index/?test=1'
});
});
$("#btn3").click(function () {
$('#SharedModalDialog').ModalDialog({
title: 'Test - modal 2 ',
body: 'This is ANOTHER test <b>content 2222 </b> more <br/> contents .....'
});
});
$("#btn2").click(function () {
$('#SharedModalDialog').ModalDialog({
title: 'Test Bootstrap Dialog - multiple button',
body: 'Are you sure you want to delete this record?',
CancelButtonText: 'Cancel',
OkButtonText: 'Yes',
OkClickRedirect: '/Home/Index/?test=2'
});
});
</script>
}
清单17显示了如何在页面加载或没有按钮单击事件时显示对话框。 清单17 隐藏,复制Code
$(document).ready(function () {
$('#SharedModalDialog').ModalDialog({
title: 'Test - Page Load',
body: 'Display on page load !!!!'
});
});
使用AngularJS和AngularUI Bootstrap的可重用模态 清单18显示了_ModalDialogNg.html文件中的模态对话框模板。按钮的可见性基于ngShow属性中的表达式,即showX、showOK和showCancel。可以通过scope类中的属性访问标题和按钮标签。AngularJS ng-bind-html指令被用来在div元素中安全地显示HTML内容。但是,仍然要确保在显示用户输入之前对其进行消毒。 清单18 隐藏,复制Code
<divclass="modal-header">
<buttontype="button"class="close"ng-show="showX"ng-click="cancel()">×</button>
<h3class="modal-title">{{title}}</h3>
</div>
<divclass="modal-body">
<divdata-ng-bind-html="htmlBind"></div>
</div>
<divclass="modal-footer">
<buttonclass="btn btn-default"ng-show="showOK"type="button"ng-click="ok()">{{btnOkText}}</button>
<buttonclass="btn btn-default"ng-show="showCancel"type="button"ng-click="cancel()">{{btnCancelText}}</button>
</div>
清单19显示了ModalPartialController.js文件的内容。控制器中使用了AngularJS $sce(严格上下文转义)服务来构建HTML值的可信版本。$uibModal是一个创建模态窗口的服务。$window服务的目的是在单击OK按钮时将请求重定向到特定的URL。隐藏或显示按钮以及设置元素标签和值的逻辑嵌入在清单19中。 清单19 隐藏,收缩,复制Code
var app = angular.module('TestAngularApp', ['ui.bootstrap']);
app.controller('modalcontroller', function ($scope, $uibModal, $window) {
$scope.openModal = function (title, body, okBtnText, okClickRedirect, cancelBtnText) {
$scope.items = [title, body, okBtnText, okClickRedirect, cancelBtnText];
var ModalInstance = $uibModal.open({
animation: true,
templateUrl: '/TemplatesNg/_ModalDialogNg.html',
controller: 'InstanceController',
backdrop: false, //disables modal closing by click on the background
keyboard: true, //disables modal closing by click on the ESC key
resolve: {
items: function () {
return $scope.items;
}
}
});
ModalInstance.result.then(function (btn) {
if (btn == "OK") {
$window.location.href = okClickRedirect;
}
}, function () { });
};
});
app.controller('InstanceController', function ($scope, $uibModalInstance, $sce, items) {
$scope.items = items;
$scope.title = $scope.items[0];
$scope.body = $scope.items[1];
$scope.btnOkText = $scope.items[2];
$scope.btnCancelText = $scope.items[4];
var returnUrl = $scope.items[3];
//allow html
$scope.htmlBind = $sce.trustAsHtml($scope.items[1]);
//hide or close the X close button on the top, you can write extra logic here to hide or show it
$scope.showX = false;
$scope.showOK = true;
if ($scope.btnOkText == '') {
//hide OK button
$scope.showOK = false;
}
//cancel button
$scope.showCancel = true;
if ($scope.btnCancelText == '') {
$scope.showCancel = false;
}
//OK clicked
$scope.ok = function () {
if (returnUrl == '') {
$uibModalInstance.close('');
} else {
$uibModalInstance.close('OK');
}
};
$scope.cancel = function () {
//it dismiss the modal
$uibModalInstance.dismiss();
};
});
清单20显示了应用程序/视图如何通过传入不同的参数来调用AngularUI Bootstrap模式。首先,包括ModalPartialController。从清单19到页面的AngularJS控制器。然后创建一个div元素,并包含ng-controller指令和控制器类modalcontroller作为它的值。在div元素中添加一个按钮,在ng-click事件中,指定控制器中定义的openModal method (ModalPartialController.js)。 清单20 隐藏,复制Code
<divng-controller="modalcontroller">
<buttonclass="btn btn-default"type="button"ng-click="openModal('AngularUI Model','Click on <b>Ok</b> to Redirect to Contact page.', 'OK', '/home/Contact', 'Close')">
Modal with redirect</button>
</div>
<divng-controller="modalcontroller">
<buttonclass="btn btn-default"type="button"ng-click="openModal('@ViewBag.Something','This is the content<b>body 2</b>', '','', 'Close It')">
Modal with close button only</button>
</div>
<divng-controller="modalcontroller">
<buttonclass="btn btn-default"type="button"ng-click="openModal('AngularUI Model 2','This is a notification!', '','', 'Ok')">
Modal with OK button only
</button>
</div>
@section scripts{
<scriptsrc="~/ControllersNg/ModalPartialController.js"></script>
}
清单21显示了如何在页面加载或没有按钮单击事件时显示对话框。 清单21 隐藏,复制Code
<divng-controller="modalcontroller"ng-init="openModal('AngularUI Model Onload','Display on page load!', '','', 'Ok')">
</div>
未来计划 将代码升级到用户Angular 2及以上版本和MVC 6核心。 结论 我希望有人会发现这些信息有用,并使您的编程工作更容易。如果你发现任何错误或不同意内容或想帮助改进这篇文章,请给我写信,我将与你一起纠正它。我建议下载演示程序并对其进行研究,以便掌握完整的概念,因为我可能会错过本文中的一些重要信息。如果你想帮助改进这篇文章,请给我发邮件。请使用以下链接报告任何问题https://github.com/bryiantan/WarningBanner/issues。 测试版本:ie 11,10,9.0, Microsoft Edge 38, Firefox 52,谷歌Chrome 56.0 历史 4/5/2017 -初始版本 2017年4月25日—更新的源代码包含了通过AJAX POST和GET方法显示模态内容的额外示例。示例在TestModalDialog页面中。 4/27/2017 -更新。net标签到ASP。添加了对参考资料部分的引用。请注意,下面的部分不在本文中,请下载源代码并探索它。有问题尽管问。 在全局中启用跨源请求。为多个url启用跨源请求(CORS)的asax文件在Web API调用期间在Ajax POST方法中包含防伪造令牌 观察这个脚本的实际操作 http://mvc.ysatech.com/ 下载 下载源代码(https://github.com/bryiantan/WarningBanner) 资源 初学者教程,了解ASP中的过滤器和属性。使用MVC, Web API和angularjs调用来自MVC 5控制器的Webapi 2服务。NET MVC ng-bind-html通过防伪造令牌MVC动作使用Ajax post为什么ASP。净MVC的请求。IsAjaxRequest卫理公会教徒对于angular的$http调用,d返回false 本文转载于:http://www.diyabc.com/frontweb/news19184.html
ASP。NET MVC警告横幅使用Bootstrap和AngularUI Bootstrap的更多相关文章
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--BootStrap
按照几个月之前的计划,也应该写一个使用Bootstrap作为OrchardNoCMS的UI库.之前这段时间都是在学习IOS开发,没顾得上写,也没顾得上维护OrchardNoCMS代码.看看我的活动轨迹 ...
- ASP.NET MVC使用Bootstrap系统(2)——使用Bootstrap CSS和HTML元素
阅读目录 Bootstrap 栅格(Grid)系统 Bootstrap HTML元素 Bootstrap 验证样式 ASP.NET MVC创建包含Bootstrap样式编辑模板 小结 Bootstra ...
- 响应式Asp.net MVC企业网站源码
最近时间充裕,自己写了一个响应式MVC企业网站系统,用于回顾自己的MVC知识.网站源码后台和前台都采用响应式布局,可以适应不同的屏幕. 一.源码描述 响应式企业网站系统,前台和后台都采用了响应式布局, ...
- 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑
Part 3: 设计逻辑层:核心开发 如前所述,我们的解决方案如下所示: 下面我们讨论整个应用的结构,根据应用中不同组件的逻辑相关性,分离到不同的层中,层与层之间的通讯通过或者不通过限制.分层属于架构 ...
- ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers
阅读目录 序言 内置的HTML Helpers 创建自定义的Helpers 使用静态方法创建Helpers 使用扩展方法创建Helpers 创建Fluent Helpers 创建自动闭合的Helper ...
- ASP.NET MVC使用Bootstrap系列(4)——使用JavaScript插件
阅读目录 序言 Data属性 VS 编程API 下拉菜单(dropdown.js) 模态框(modal.js) 标签页(tab.js) 工具提示(tooltip.js) 弹出框(popover.js) ...
- ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件
阅读目录 Bootstrap 导航条 列表组 徽章 媒体对象 页头 路径导航 分页 输入框组 按钮式下拉菜单 警告框 进度条 小结 Bootstrap为我们提供了十几种的可复用组件,包括字体图标.下拉 ...
- 使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑
翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑 Part 3: 设计逻辑层:核心开发 如前所述,我们的解决方案 ...
- 警告框在asp.net mvc中应用
Bootstrap与asp.net MVC框架结合,产生警告框.主要是利用控制器的TempData 字典对象 生成临时数据. ASP.NET MVC的TempData用于传输一些临时的数据,例如在各个 ...
随机推荐
- codeforces 1262D Optimal Subsequences 主席树询问第k小
题意 给定长度为\(n\)的序列\(a\),以及m个询问\(<k,pos>\),每次询问满足下列条件的子序列中第\(pos\)位的值为多少. 子序列长度为\(k\) 序列和是所有长度为\( ...
- Oracle数据库访问客户端 sqldeveloper-19.2.1.247.2212-x64 下载
Oracle数据库访问客户端 sqldeveloper-19.2.1.247.2212-x64 地址:https://pan.baidu.com/s/1iojCVxwXocyM8oObTf0xaw 这 ...
- Brup sute
暴力破解
- 接口自动化---简单的数据驱动框架ATP(基于excel)
数据驱动测试:根据数据进行测试.将用例写入excel文件,用代码读取文件中的数据,从而实现自动化测试. 自动化框架实现步骤: 1.获取用例 2.调用接口 3.校验结果 4.发送测试报告 5.异常处理 ...
- linux系统jdk安装
1.软件包下载:官网 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载linu ...
- python3 while循环
python不支持n++这样格式,因为python中变量不像c那样事先定义好变量类型,在内存中开辟指定的空间,然后赋值. python中以字符串为例,事先在内存划分空间来存放字符串,然后用变量名来指向 ...
- CentOS7下mysql忘记root密码的处理方法
1. vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/my ...
- [leetCode]5. 最长回文子串(DP)
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 题解 dp.先初始化长度为1和长度为2的串.再依次算长度为3,4,5.... 当找到回文串时,若长度比当 ...
- 【好消息】博客迁移到github,求关注,求star,求支持
博客迁移到github 地址:https://github.com/dirkhe1051931999/hjBlog
- domReady的理解
domReady的理解 domReady是名为DOMContentLoaded事件的别称,当初始的HTML文档被完全加载和解析完成之后,DOMContentLoaded事件被触发,而无需等待样式表.图 ...