【问题标题】:MVC Validation not workingMVC 验证不起作用
【发布时间】:2015-07-22 19:46:03
【问题描述】:

我有一个视图,它有一个用于输入用户名的文本框,然后是两个复选框。它将用于将所述用户名添加到复选框标记的角色中。文本框不应允许输入空/空字符串,如果用户名已存在,请警告此人。

查看

@model QIEducationWebApp.Models.UserAdmin

<h1 class="page-header">Add New User</h1>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

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

    <table class="table">
        <tr>
            <th class="table-row">
                User Name:
            </th>
            <td class="table-row">
                @Html.TextBoxFor(model => model.UserName)
                @Html.ValidationMessageFor(model => model.UserName)
            </td>
        </tr>
        <tr>
            <th class="table-row">
                Role:
            </th>
            <td class="table-row">
                @Html.DropDownListFor(model => model.UserRole,
                    @ViewBag.Roles as SelectList, " -- Select Role -- ", new { @class="form-control" })
                @Html.ValidationMessageFor(model => model.UserRole)
            </td>
        </tr>
        <tr><td class="table-row-blank"></td></tr>
        <tr>
            <td class="table-row-button">
                <input class="button" type="submit" value="Create" />
                <input type="button" class="button" value="Cancel" 
                    onclick="location.href='@Url.Action("AllUsers")'" />
            </td>
        </tr>
    </table>
}

型号

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[Required(ErrorMessage = "Required")]
[Remote("ExistUser", "Admin", HttpMethod = "POST",
    ErrorMessage = "User is assinged, Edit instead")]
[DataMemberAttribute()]
public global::System.String UserName
{
    get
    {
        return _UserName;
    }
    set
    {
        OnUserNameChanging(value);
        ReportPropertyChanging("UserName");
        _UserName = StructuralObject.SetValidValue(value, false);
        ReportPropertyChanged("UserName");
        OnUserNameChanged();
    }
}
private global::System.String _UserName;
partial void OnUserNameChanging(global::System.String value);
partial void OnUserNameChanged();

控制器验证方法

[HttpPost]
public JsonResult ExistUser(String UserName)
{
    bool exist = db.UserAdmins.Any(u => u.UserName == UserName);

    return Json(!exist);
}

控制器发布方法

[Authorize(Roles = "Director")]
[HttpPost]
public ActionResult AddNewUser(UserAdmin user)
{
    if (ModelState.IsValid)
    {
        db.UserAdmins.AddObject(user);
        db.SaveChanges();
        return RedirectToAction("AllUsers");
    }
    ViewBag.Roles = new SelectList(db.UserRoles, "UserRoleID", "UserRole1", user.UserRole);
    return View(user);
}

目前它允许在提交时传入空字符串,而不是显示错误。而且我的自定义验证甚至没有启动,我的调试受到了打击。

我已经在应用程序的其他部分使用了它,并且这些部分仍然有效。

附:如果你们需要更多代码,请告诉我,我会尽快完成。

编辑:: 与原始帖子完全不同的代码。

Volkan Paksoy 指出我缺少的 ModelState.IsValid 并查看返回。

对于客户端验证,我错过了我的

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

【问题讨论】:

  • 使用[必需]属性
  • 修改您的 POST Action 以获取模型的实例,而不仅仅是字符串值。
  • @HadiHassan 已经在里面了,没关系
  • @ChrisBohatka 如果您的意思是只传入用户用户,然后在代码中将用户名切换为用户名,那是行不通的
  • 如果客户端验证不起作用,因为您没有按正确顺序包含相关脚本(您是否在显示的 2 个脚本之前包含了jquery{version}.js?)或未启用.而且您还没有显示您的 POST 方法(仅用于远程验证的方法),因此无法判断您是否可能有错误。

标签: c# asp.net-mvc validation


【解决方案1】:

首先,正如@Chris Bohatka 所建议的,您必须使用您的模型作为参数(在这种情况下为用户类)

然后你必须像这样检查 ModelState 的状态:

if (!ModelState.IsValid)
{
    // There is an error on the page, load the same view to display the errors
}

// Model is fine, carry on with the other stuff...

我调试并在 ModelState 错误集合中看到“必须输入用户名”,因此您要做的就是返回相同的视图,以便用户可以看到错误并修复它。

【讨论】:

  • 谢谢。那是下降的一部分。我不知道它只是重新加载了错误的页面。
  • 当框为空时显示错误。关于用户是否已经在系统中的客户端验证没有受到影响。
【解决方案2】:

也许您没有启用客户端验证,在这种情况下,即使字段不正确,它也会进行发布。此外,在您的后控制器方法中,您没有检查 ModelState 的有效性,这可能是无效的,这意味着您没有陷入验证问题。将此添加到您的控制器方法中:

if (ModelState.IsValid) { do work };

并确保您在 web.config 中有这些行以启用客户端 (JavaScript) 验证,在这种情况下,在字段值有效之前不会发布帖子:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多