MVC调用另一个控制器动作

时间:2009-09-22 19:15:03

标签: c# asp.net-mvc

我已经启动了一个MVC项目,它为我创建了AccountController类。 所以要登录我当前的网站,我必须去,localhost:2500 \ Account.mvc \ LogOn

我想在Index视图中登录HomeController。所以基本上如果你去了我的网站的根,如果没有经过身份验证,你将不得不登录去其他地方。

所以我所做的就是将表单添加到我的索引视图中并尝试将其发布到我的 调用LogOn操作的帐户视图。

我调用了BeginForm方法,将其传递给我的操作和相应的视图(LogOn,Account)。当我单击该按钮时,它不会发布到“帐户”视图,因此不会执行LogOn操作。相反,它只是发布到Home视图再次调用Index操作。所以它对我没什么用......哈哈。

不确定我做错了什么。下面是来自Home / Index.aspx的原始表单代码,然后我也会在点击登录按钮之前显示源代码。

这是来自Home / Index.aspx的代码:

  <% using (Html.BeginForm("LogOn", "Account")) { %>
            <div>
                <fieldset>
                    <legend>Account Information</legend>
                    <p>
                        <label for="username">Username:</label>
                        <%= Html.TextBox("username") %>
                        <%= Html.ValidationMessage("username") %>
                    </p>
                    <p>
                        <label for="password">Password:</label>
                        <%= Html.Password("password") %>
                        <%= Html.ValidationMessage("password") %>
                    </p>
                    <p>
                        <%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label>
                    </p>
                    <p>
                        <input type="submit" value="Log On" />
                    </p>
                </fieldset>
            </div>
        <% } %>

查看Home.mvc / Index的来源:

<form action="/Account.mvc/LogOn" method="post">
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <p>
                <label for="username">Username:</label>
                <input id="username" name="username" type="text" value="" />

            </p>

            <p>
                <label for="password">Password:</label>
                <input id="password" name="password" type="password" />

            </p>
            <p>
                <input id="rememberMe" name="rememberMe" type="checkbox" value="true" /><input name="rememberMe" type="hidden" value="false" /> <label class="inline" for="rememberMe">Remember me?</label>
            </p>

            <p>
                <input type="submit" value="Log On" />
            </p>
        </fieldset>
    </div>
</form>

我在LogOn操作中设置了一个断点,它永远不会被击中,所以它也不是登录错误。

看起来html源代码中的操作设置正确,我只是不明白为什么它没有正确发布。我做的不对。如果您有任何想法,请告诉我。谢谢!

帐户视图中的LogOn操作:

[AcceptVerbs(HttpVerbs.Post)]
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
            Justification = "Needs to take same parameter type as Controller.Redirect()")]
        public virtual ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
        {

            if (!ValidateLogOn(userName, password))
            {
                return View();
            }

            FormsAuth.SignIn(userName, rememberMe);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

1 个答案:

答案 0 :(得分:2)

您能否确认/Account.mvc/LogOn是有效路线?

要检查的事项:

  • 路线有效吗?

  • LogOn操作是否具有ActionVerb,以防止发布请求 - 例如: [ActionVerbs(HttpVerbs.Get)]

修改 看着你的代码,忽略了断点的事实。被重定向到主页,因为你没有传递returnUrl,它会不会只是在成功后将你送回主页?

将它放在您的母版页中。它又回归了什么?

<%=Request.IsAuthenticated %>

编辑2:

显然这会返回false。

好的......所以控制器没问题,视图看起来还可以,并且正在呈现正确的URL ...我认为ASP.NET MVC已经安装并且在GAC中,因为你也可以浏览到其他网址如LogOn直接。看起来你在Windows XP上运行它,假设路线中有'.mvc'。

您的路线是什么样的?你有没有对它们做过任何改变?