Html.BeginForm中的System.StackOverflowException

时间:2015-05-21 22:15:35

标签: c# asp.net asp.net-mvc

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

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.StackOverflowException'发生在mscorlib.dll

有时只是这个错误,

  

类型' 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页面上生成链接。

1 个答案:

答案 0 :(得分:3)

@Html.Action("Login", "Account")是一种调用Login() AccountController方法的方法,并呈现它返回的局部视图。要为链接生成网址,您需要使用@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]属性修饰方法所需的授权。如果未经授权的用户导航到该方法,则它们会自动重定向到登录页面,该登录页面可能包括指向注册页面的链接,这两个页面都用于授权用户。导航到登录页面的“注册”页面中的链接似乎不常见(为什么已注册的用户会导航到注册页面?)