asp.net-mvcorchardcmsorchardcms-1.9

Trying to create drop down login for Orchard CMS


I am new to Orchard and to ASP.NET MVC. I am trying to override the login process for users so that instead of going to a dedicated login page (the default process) they get a drop down form from the user menu that logs them in. I have created overrides in my custom theme for LogOn.cshtml and User.cshtml. The code is as follows:

//User.cshtml
@using System.Web.Mvc;
@using Orchard.ContentManagement;

<nav class="navbar navbar-default navbar-fixed-top">
    <div class="container-fluid">
        <ul class="nav navbar-nav pull-right">
        @if (WorkContext.CurrentUser != null) {
            <li class="dropdown">
                <button id="userDropdown" class="btn btn-primary navbar-btn dropdown-toggle" data-toggle="dropdown">
                    Welcome @Html.ItemDisplayText(WorkContext.CurrentUser) <span class="caret"></span>
                </button>
                <ul class="dropdown-menu">
                    <li>
                        @Html.ActionLink(T("Change Password").ToString(), "ChangePassword", new { Controller = "Account", Area = "Orchard.Users" })
                    </li>
                    <li>
                        @Html.ActionLink(T("Sign Out").ToString(), "LogOff", new { Controller = "Account", Area = "Orchard.Users", ReturnUrl = Context.Request.RawUrl }, new { rel = "nofollow" })
                    </li>
                    @if (AuthorizedFor(Orchard.Security.StandardPermissions.AccessAdminPanel)) {
                        <li class="divider"></li>
                        <li>
                            @Html.ActionLink(T("Dashboard").ToString(), "Index", new { Area = "Dashboard", Controller = "Admin" })
                        </li>
                    }
                </ul>
            </li>
        }
        else {
            <li class="dropdown">
                <button class="btn btn-primary navbar-btn dropdown-toggle" data-toggle="dropdown">
                    Sign In <span class="caret"></span>
                </button>
                <ul class="dropdown-menu dropdown-menu-right">
                    <li>
                        @Display.LogOn()
                    </li>
                </ul>
            </li>
        }
    </ul>
</div>

//LogOn.cshtml
@using System.Web.Mvc;
@using Orchard.ContentManagement;

<div>
@using (Html.BeginFormAntiForgeryPost(Url.Action("LogOn", new { ReturnUrl = Request.QueryString["ReturnUrl"] }))) {
    <fieldset class="login-form group">
        <legend>@T("Account Information")</legend>
        <div class="form-group">
            <label for="username-email">@T("Username")</label>
            @Html.TextBox("userNameOrEmail", "", new { id = "username-email", autofocus = "autofocus", @class = "validate[required]" })
            @Html.ValidationMessage("userNameOrEmail")
        </div>
        <div class="form-group">
            <label for="password">@T("Password")</label>
            @Html.Password("password", null, new { @class = "validate[required]" })
            @Html.ValidationMessage("password")
        </div>
        <div class="checkbox">
            <label class="forcheckbox" for="remember-me">
                @Html.CheckBox("rememberMe", new { id = "remember-me" }) @T("Remember Me")
            </label>
        </div>
        <div class="form-group">
            <button class="primaryAction" type="submit">@T("Sign In")</button>
        </div>
    </fieldset>
}
</div>

The form displays fine in the dropdown, but when the submit button is clicked, I get a HTTP 404 error: Requested URL: /OrchardLocal/Contents/Item/LogOn.

I'm afraid that the default login process requires a separate view. I've been trying to figure out which existing override to use, but I'm just not seeing it. Any help would be greatly appreciated. Thanks.


Solution

  • You should be able to login properly by changing your form from

    @using (Html.BeginFormAntiForgeryPost(Url.Action("LogOn", new { ReturnUrl = Request.QueryString["ReturnUrl"] })))
    

    to something like this:

    @using ( Html.BeginForm("LogOn", "Account", new { area = "Orchard.Users" /*other route values here*/ }, FormMethod.Post) )
    {
        @Html.AntiForgeryToken()
    
        // ... your stuff here
    }
    

    This is the same for every other controller action. If in doubt: specify the area explicitly.