系统.Html.BeginForm中的StackOverflowException

本文关键字:StackOverflowException 中的 BeginForm Html 系统 | 更新日期: 2023-09-27 17:50:17

我的行为很奇怪。我正在创建一个简单的用户创建模块。我创建了一个非常简单的模型,

public class CreateUser
{
    [Required]
    public string Email { get; set; }
    [Required]
    [Display(Name = "User name")]
    public string Username { get; set; }
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }
    [DataType(DataType.Password)]
    [Display(Name = "Confirm Password")]
    [Compare("Password", ErrorMessage = "The new password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

当我访问视图时,显示以下异常消息,

类型为"System.Web"的异常。HttpException'在System.Web.dll中发生,但未在用户代码中处理

附加信息:执行处理程序'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'的子请求错误。

,有时同一页给出这个异常,

类型为"System"的未处理异常。在mscorlib.dll中发生StackOverflowException

有时只是这个错误,

类型为"System.Web"的异常。HttpException'在System.Web.dll中发生,但未在用户代码中处理

我已经隔离了问题,但我无法理解我的视图有什么问题。下面是我的视图

@model Practice_Project.Models.Accounts.CreateUser
@{
    ViewBag.Title = "Register";
 }
@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "validator-form form-horizontal", role = "form" }))
                    {
                        <div class="form-group">
                            <label for="Email" class="col-sm-3">Email</label>
                            <div class="col-md-9">
                                <input type="text" class="form-control inputmask" id="Email" name="Email" placeholder="Email">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="username" class="col-sm-3">User Name</label>
                            <div class="col-md-9">
                                <input type="text" class="form-control inputmask" id="Username" name="Username" placeholder="User Name">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="Password" class="col-sm-3">Password</label>
                            <div class="col-md-9">
                                <input type="password" class="form-control" id="Password" name="Password" placeholder="Password">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="ConfirmPassword" class="col-sm-3">Confirm Password</label>
                            <div class="col-md-9">
                                <input type="password" class="form-control" id="ConfirmPassword" name="ConfirmPassword" placeholder="Re-Type your Password">
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-7">
                                <button type="submit" class="btn btn-success" value="Validate">Sign In</button>
                                <span class="pull-right">
                                    <small>Not Register ?</small>
                                    <span>
                                        <a href="@Html.Action("Register", "Account")" class="btn btn-info">Signup Now</a>
                                    </span>
                                </span>
                            </div>
                        </div>
                    }

当我从表单中删除这最后一段代码时,异常就不会发生了,

<div class="form-group">
                            <div class="col-md-7">
                                <button type="submit" class="btn btn-success" value="Validate">Register</button>
                                <span class="pull-right">
                                    <small>Already Registered?</small>
                                    <span>
                                        <a href="@Html.Action("Login", "Account")" class="btn btn-info">SignIn Now</a>
                                    </span>
                                </span>
                            </div>
                        </div>

我看不出这段代码有什么问题,当删除错误时,错误就消失了。在故障排除选项中提到,它可能是由于无限循环,但如何?

编辑:控制器非常简单,现在只有两个方法,因为我正在添加。以下是控制器

的代码
[Authorize]
public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Register()
    {
        return View();
    }
    [AllowAnonymous]
    public ActionResult Login()
    {
        return View();
    }
}

注意我正试图在Register页面上生成一个链接,该链接导航到Login页面。

系统.Html.BeginForm中的StackOverflowException

@Html.Action("Login", "Account")是一个调用AccountControllerLogin()方法并呈现它返回的部分视图的方法。为了生成链接的url,您需要使用@Url.Action("Login", "Account"),尽管我建议您使用

@Html.ActionLink("SignIn Now", "Login", "Account", null, new { @class = "btn btn-info" })

出现异常的原因(如注释中所示)是您还没有为Login方法创建视图(Login方法试图返回一个不存在的视图)。

然而,你的代码还有其他问题。您的属性是用验证属性装饰的,但是由于您手动生成html并省略了data-val-*属性,因此您将无法获得客户端验证,并且由于表单中没有@Html.ValidationSummary()@Html.ValidationMessageFor()帮助程序,因此将不会显示服务器端验证错误。删除每个属性的手动html并替换为

<div class="form-group">
    @Html.LablFor(m => m.Email, new { @class = "col-sm-3" })
    <div class="col-md-9">
        @Html.TextBoxFor(m => m.Email, new ( placeholder="Email" })
        @Html.ValidationMessageFor(m => m.Email)
    </div>
<div>

,其他属性也是如此。还包括客户端验证的相关文件(通常通过在视图中包含@Scripts.Render("~/bundles/jquery")@Scripts.Render("~/bundles/jqueryval"))。

最后,典型的方法是使用[Authorize]属性修饰需要授权的方法。如果未经授权的用户导航到该方法,他们将自动重定向到登录页面,其中可能包含到注册页面的链接,这两个页面都用于授权用户。在注册页面中有一个链接导航到登录页面似乎很不寻常(为什么已经注册的用户要导航到注册页面呢?)

相关文章:
  • 没有找到相关文章