c# - ASP.NET MVC 3 表单提交影响 RenderAction 处理程序

标签 c# asp.net-mvc-3

我可以控制用户授权,包括表单、两个文本框和提交按钮。 此控件通过 RenderAction 方法包含在母版页中。 我有注册页面(它的 View 通过 RenderBody 方法包含)也有表格。当我从注册表单提交数据时,也会触发登录控件并调用其处理程序(用于处理 POST 数据的 Controller 方法)。您可以在下面看到用于授权的 Controller 方法。 从其他表单提交数据后,如何防止向登录控件发送POST数据?

        [HttpPost]
        public RedirectResult LogIn(AuthViewModel authResult)
        {
            if (ModelState.IsValid)
            {
                userService.LogInUser(authResult.Login, authResult.Password, Request.UserHostAddress);
            }
            else
            {
                TempData["AuthMessage"] = GetValidationMessage();
            }
            string redirectUrl = "/";
            if (Request.UrlReferrer != null)
            {
                redirectUrl = Request.UrlReferrer.AbsoluteUri.ToString();
            }
            return Redirect(redirectUrl);

        }

        [HttpGet]
        [ChildActionOnly]
        public PartialViewResult LogIn()
        {
            if (userService.IsUserLoggedIn())
            {
                User currentUser = userService.GetLoggedInUser();
                ViewBag.LoggedInMessage = currentUser.FullName + "(" + currentUser.Login + ")";
            }
            return PartialView("AuthControl");
        }

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>@ViewBag.Title</title>
</head>

<body>
    <div>
        <div id="header">
            <div>
                <div>
                    @{Html.RenderPartial("SearchControl");}
                </div>
            </div>
        </div>
        <div id="right_menu">
            <div>
                @{Html.RenderAction("LogIn", "Navigation");}
            </div>
                @{Html.RenderAction("Menu", "Navigation");}
            <div>
                 @{Html.RenderAction("Index", "Messages");}
            </div>
            <div>
                @{Html.RenderAction("TagCloud", "Navigation");}
            </div>
        </div>
        <div id="main_content">
            @RenderBody()
        </div>
        <div id="footer">
        </div>
    </div>
</body>
</html>

授权控制:

@model AuthViewModel

<div class="rounded-corners auth-panel">
    @if (ViewBag.LoggedInMessage == null)
    {
        <div class="auth-container">
            @using (Html.BeginForm("LogIn", "Navigation"))
            {
                <div>
                    <label for="Login">
                        Login:
                    </label>
                    @Html.TextBoxFor(m => m.Login, new { @class="middle-field"})
                </div>
                <div>
                    <label for="Password">
                        Password:
                    </label>
                    @Html.PasswordFor(m => m.Password, new { @class="middle-field"})
                </div>
                <div class="in-center">
                    <input type="image" src="@Url.Content("~/Content/Images/submit.png")"/>
                </div>
            }
        </div>

        <div class="error-msg">
            @if (TempData["AuthMessage"] != null)
            { 
                @Html.Raw(TempData["AuthMessage"].ToString())
            }
            @Html.ValidationSummary()
         </div>
        <div class="small-nav-message">
            <a href="#" class="registration-link">Registration</a>
        </div>
    }
</div>

注册页面:

RegistrationViewModel

@{
    ViewBag.Title = "Registration";
}
@if (TempData["RegistrationFinished"] == null || !(bool)TempData["RegistrationFinished"])
{
<div class="post content-holder">
    <div class="fields-holder">
        <div >
            <div class="error-msg">
                @if (TempData["ValidationMessage"] != null)
                { 
                    @Html.Raw(TempData["ValidationMessage"].ToString())
                }
            </div>
            @using (Html.BeginForm())
            {   
                <span>
                    Email:
                </span>
                <span>
                    @Html.TextBoxFor(v => v.Email)
                </span>
                <span>
                    Password:
                </span>
                <span>
                     @Html.PasswordFor(v => v.Password)
                </span>
                <input type="submit" value="Register"/>
            }
            </div>
    </div>
</div>
}
else
{
    <div>
        Activation link was sent to your email.
    </div>
}

最佳答案

在注册 View 中,更改

@using (Html.BeginForm())

@using (Html.BeginForm("Index", "Registration"))

在单个 Controller 、单个 Action 场景中,不需要额外的特定路由信息,但显然路由引擎无法自行确定将多个 Controller /操作路由到哪个 Controller /操作。

根据评论编辑:

所以这是一个路由问题。尝试为您的注册操作添加特定路线。有点像

routes.MapRoute(
    "Register", // Route name
    "{controller}/Index/{registrationResult}", // URL with parameters
    new { 
        controller = "{controller}", 
        action = "Selector", 
        registrationResult= UrlParameter.Optional
        }
);

'registrationResult' 将是后操作中的参数名称。我在想 View 模型是如此相似以至于路由引擎无法区分两者。在默认路由之前添加上面的路由,提交注册表时应该匹配。

关于c# - ASP.NET MVC 3 表单提交影响 RenderAction 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902294/

相关文章:

c# - .Net 使用 Bouncy CaSTLe 以编程方式签署 PKCS#10 请求

asp.net-mvc - 使用AD的基于ASP.NET MVC表单的Auth可以在本地工作,但在服务器(iis7)上将失败

c# - 为什么会发生此错误 'Sequence contains no elements' ?

javascript - 未调用局部 View 中的 JQuery

C#模拟音量静音按下

c# - 将 C++ COM 对象更新为 C#

c# - 如何在 C# ASP.NET Core 中从没有 id 的 MySql 中选择一个项目

c# - 减少类型转换和更好的造型

c# - Html.BeginForm Post 转到 HttpGet 操作而不是 IE 中的 HttpPost,在 Chrome 和 Firefox 中很好

asp.net-mvc-3 - 如何在MVC3中限制FileUpload中的文件类型?