ASP.NET MVC 4默认模板在_LoginPartial.cshtml中具有不同的注销语法

时间:2012-11-28 09:52:48

标签: asp.net-mvc-4

我第一次使用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")    

请有人帮助我理解为什么这是必要的,以及它的优点(如果有的话)。感谢

6 个答案:

答案 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。

所以,他们需要以下内容:

  1. 注销链接的锚标记,以使其样式与登录链接相同。
  2. 可以提交表单的按钮,以便验证AntiForgeryToken。
  3. 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");
        }
    });

}