我遇到了非常奇怪的行为。我正在创建一个简单的用户创建模块。我创建了一个非常简单的模型,
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
页面上生成链接。
答案 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]
属性修饰方法所需的授权。如果未经授权的用户导航到该方法,则它们会自动重定向到登录页面,该登录页面可能包括指向注册页面的链接,这两个页面都用于授权用户。导航到登录页面的“注册”页面中的链接似乎不常见(为什么已注册的用户会导航到注册页面?)