【问题标题】:Remote Validation working elsewhere远程验证在别处工作
【发布时间】:2015-08-28 14:33:51
【问题描述】:

我有一个用户注册页面,我在其中实现了用户名的远程验证概念。我基本上想为每个用户名保留一个唯一值。我能够实现它,但是现在在登录页面中,当我输入用户名时,它会提示一条消息,说用户名不可用。这仅适用于注册页面,而不是登录页面。有人可以解释我在做什么错误。我有一个具有 Username 属性的模型用户;我正在使用远程验证。我有一个名为 UserNameExsists 的 Action 方法,它被触发以进行远程验证。以及用于验证的注册视图。但是登录页面也会触发验证。有没有办法只为注册视图设置它?

型号:

public class User
{
    public int ID { get; set; }
    [Required]
    [Remote("UserNameExists","User",ErrorMessage="Username not available")]
    [Display(Name="User Name")]
    public string UserName { get; set; }
    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
    [Required]
    [Display(Name="First Name")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name="Last Name")]
    public string LastName { get; set; }
    [Required]
    [DataType(DataType.PhoneNumber)]
    [MinLength(10)]
    [MaxLength(10)]
    [Display(Name="Mobile No")]
    public string PhoneNum { get; set; }
}

控制器:(名称是用户)

    //Remote Validation
    public JsonResult UserNameExists(string username)
    {
        bool user = db.Users.Any(p => p.UserName == username) ? false : true;
        return Json(user,JsonRequestBehavior.AllowGet);

    }

查看:

注册页面查看

@model HindiMovie.Models.User

@{
ViewBag.Title = "Register";
}
<link href="~/Content/Site.css" rel="stylesheet" />
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

<h2>Register</h2>

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>User</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Password)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Password)
        @Html.ValidationMessageFor(model => model.Password)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.FirstName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FirstName)
        @Html.ValidationMessageFor(model => model.FirstName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.LastName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LastName)
        @Html.ValidationMessageFor(model => model.LastName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.PhoneNum)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.PhoneNum)
        @Html.ValidationMessageFor(model => model.PhoneNum)
    </div>

    <p>
        <input type="submit" value="Register" />
        <input type="reset" value="Clear" />
    </p>
</fieldset>
}

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

登录页面查看:

@model HindiMovie.Models.User
@{
ViewBag.Title = "Login";
}

<h2>Login</h2>

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()


<fieldset>
    <legend>User</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Password)
    </div>
    <div class="editor-field">
        @Html.PasswordFor(model => model.Password)
        @Html.ValidationMessageFor(model => model.Password)
    </div>





    <p>
        <input type="submit" value="Sign in" />
    </p>
</fieldset>


}

@Html.ValidationMessage("LogOnError")

<div>
@Html.ActionLink("Create account", "Register","User")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

【问题讨论】:

  • 为登录页面和注册页面创建单独的视图模型,问题应该消失了。
  • @MarnixvanValen:所以基本上原因是我在两个不同的视图中使用相同的模型?但是如果我创建 2 个不同的模型,它们将在每个模型中具有重复的属性,并且它们将引用数据库中的同一个表。那不是效率低吗?
  • 这样做是有充分理由的。谷歌搜索诸如over张贴之类的东西,以获取有关安全方面的更多信息。是的,这需要更多的工作,有利于更好的安全性和更好的关注点分离。
  • @MarnixvanValen:谢谢。 :) 有没有任何你知道的教程?
  • Visual Studio 自带的默认 MVC 项目有单独的登录和注册模型。你应该看看那些

标签: asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

您对登录和注册页面使用相同的模型,因此您在两个页面上获得相同的验证。

为每个视图创建一个 ViewModel 并将您的验证属性放在那里。 这样您就可以区分每个页面的验证。

【讨论】:

  • 我创建了一个名为 UserLogin 的 ViewModel 并将登录视图中的模型更改为它并且它可以工作。 :) 非常感谢先生。 :)
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 2020-04-16
  • 1970-01-01
  • 2021-05-15
  • 2014-10-25
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多