@ Html.ActionLink不重定向

时间:2012-11-09 11:20:13

标签: asp.net-mvc-3

我目前正在做一个简单的登录应用程序,它也允许用户更改其密码。但是,我的@Html.ActionLink没有重定向到更改密码页面,我认为这是因为我在web.config中的设置。我该如何解决?

这是我的代码。

Index.chtml(登录页面)

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">   </script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<h2>@ViewBag.Title</h2>

@using(Html.BeginForm())
{
    @Html.LabelFor(login => login.Username) 
    @Html.TextBoxFor(login => login.Username)<br/>
    @Html.LabelFor(login => login.Password) 
    @Html.PasswordFor(login => login.Password)<br/>
    <input type="submit" value="Login" />
    @Html.ActionLink("Change Password", "Index", "ChangePW")
    @Html.ValidationSummary()
}
@ViewBag.Error

的Web.config

  <location>
    <system.web>
      <authorization>
        <deny users="?"/>
      </authorization>
    </system.web>
  </location>

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <location path="Scripts">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

点击Change Password后生成的HTML代码:

<div>
  <h2>BlueBerry Login</h2>

  <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
  <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
  <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript">    </script>
  <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
  <h2></h2>

  <form action="/Login?ReturnUrl=%2fChangePW" method="post">
    <label for="Username">User name: </label>
    <input data-val="true" data-val-required="The User name:  field is required."   id="Username" name="Username" type="text" value="" />
    <br/>
    <label for="Password">Password: </label>
    <input data-val="true" data-val-required="The Password:  field is required." id="Password" name="Password" type="password" />
    <br/>
    <input type="submit" value="Login" />
    <a href="/ChangePW">Change Password</a>
    <div class="validation-summary-valid" data-valmsg-summary="true">
    <ul>
      <li style="display:none"></li>
    </ul>
    </div>
  </form>
</div>

更新 我在进入应用程序时尝试使用@Html.ActionLink并且它有效。这真的很奇怪......

更新2

这是登录控制器的代码

public class LoginController : Controller
{
    //
    // GET: /Login/
    #region Declarations

    MembershipHelper _mem = new MembershipHelper();
    #endregion

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(MasterUser user)
    {
        if (ModelState.IsValid)
        {
            if (_mem.ValidateUser(user.Username, user.Password)) //successful
            {
                FormsAuthentication.SetAuthCookie(user.Username, false);
                user = _mem.LoggedUser;
                Session["loggedUser"] = user;
                return RedirectToAction("Index", "Home");

            }
            ModelState.AddModelError("",_mem.Status);
        }
        else
        {
            ModelState.AddModelError("", "User does not exist");
        }
        return View();
    }        
}

1 个答案:

答案 0 :(得分:0)

错误答案,见下文

在你的web.config中,这个:

<location>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

只有登录用户才能访问您应用/网站中的所有网址。添加此

<location path="ChangePW">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
</location>

将您的“更改密码”页面从之前的规则中豁免,即使没有登录也可以访问。

您可以在此之后安全地放回@HtmlActionLink,现在可以正常使用。


修改

显然,MVC routing does not work at all with the authorization stuff in web.config。如该链接的答案所述,只需将[Authorize]添加到您希望在登录后限制的所有控制器操作。当然,您必须删除授权部分,拒绝web.config中的所有用户。

一种不那么乏味的方法可能是将ChangePassword操作移动到新控制器,然后您可以通过允许所有用户使用新控制器来使用web.config中的授权。