我第一次使用ASP.NET MVC 4,所以我开始使用默认模板。
在_LoginPartial.cshmtl for Log off链接中,我找到了以下代码
@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) {
@Html.AntiForgeryToken()
<a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
}
我期待下面的代码,我一直在MVC 3中使用。
@Html.ActionLink("Log off", "LogOff", "Account")
请有人帮助我理解为什么这是必要的,以及它的优点(如果有的话)。感谢
答案 0 :(得分:3)
新语法的原因是它遵循更多RESTful语法。通过注销,您正在更改用户的状态(因此POST操作)。
答案 1 :(得分:2)
在使MVC 4变得安静的同时,默认模板不允许禁用JavaScript的用户注销。这是解决该问题的方法。
注意我还在此处发表了关于此问题的博文:http://www.shiningtreasures.com/post/2013/08/09/cannot-log-out-of-aspnet-mvc4-without-javascript
@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) {
@Html.AntiForgeryToken()
<a id="logout" href="javascript:document.getElementById('logoutForm').submit()" style="display:none">Log Off</a>
<script>
//<!--
var l = document.getElementById('logout');
if (typeof(l) != 'undefined' && l != null)
l.style.display = "inline";
//-->
</script>
<noscript>
<input type="submit" value="Log Off" />
</noscript>
}
基本上,当JavaScript不可用时,它会回退到提交按钮而不是链接。在所有情况下我们仍然使用POST。
另一个小问题 - 模板的CSS使按钮看起来与链接不同。这是CSS修复注销按钮样式的修复程序,因此它看起来与实际锚标记的其他“按钮”相同。
/* drop this in just above "info and errors" */
#logoutForm input[type="submit"],
#logoutForm input[type="button"],
#logoutForm button
{
background-color: #d3dce0;
color: #333;
border: none;
border: 0px;
font-size: 1em;
font-weight: 400;
margin: -4px 3px -4px 10px;
padding: 2px 3px;
text-decoration: none;
font-family: inherit;
outline: medium none;
}
/* for mobile styles - you need to drop this one in right after the other
#login styles in the mobile block (near the bottom of the file) */
#login input[type="submit"],
#login input[type="button"],
#login button
{
background: none;
color: #999;
border: none;
border: 0px;
font-size: 1em;
font-weight: 600;
margin: -4px 3px -4px 6px;
padding: 0;
text-decoration: none;
font-family: inherit;
outline: medium none;
}
答案 2 :(得分:1)
没有太大区别。 MVC4使用HTML表单注销,通过javascript提交。
优点是新方式(使用表单)使用javascript提交表单,这就是页面无需重新加载的原因。
答案 3 :(得分:1)
我很确定他们在这里使用JavaScript的唯一原因是因为提交按钮的css样式与“login”按钮的css样式不匹配,“按钮”是由HTML助手创建的锚标签代码:
@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })
。
以下内容将在应用中创建完全相同的行为:
<input type="submit" value="Log Off" />
但它看起来很可怕。
当然,他们不能再使用HTML帮助程序ActionLink作为注销按钮,因为这是一个需要POST的表单,以便可以验证AntiForgeryToken。
所以,他们需要以下内容:
Hench一个锚标签,通过显式.submit()JavaScript触发表单回发。
答案 4 :(得分:0)
“优点是新方式(使用表单)使用javascript提交表单,这就是为什么页面不必重新加载”...(user1797792)
这完全是不真实的,因为Html.BeginForm总是触发回发,Ajax.BeginForm是不会触发回发的异步表单助手
我更喜欢旧的动作链接样式,因为不会弄乱css,但是通过查看功能,似乎actionlink已被表单替换,因此AntiForgeryToken可以包含在请求中,并且会阻止跨站点脚本阻止你您自己的帐户或类似的东西。
答案 5 :(得分:0)
function btnContinueClick() {
debugger
$.ajax({
url: '@Url.Action("BIAssessmentTest", "BI")',
type: 'Post',
cache: false,
success: function (data) {
window.location.href = '@Url.Action("BIAssessQuestions", "BI")';
},
error: function (err) {
debugger
alert("hi");
}
});
}