【问题标题】:Client or server validation doesn't work with Data Annotations客户端或服务器验证不适用于数据注释
【发布时间】:2014-06-23 15:23:25
【问题描述】:

我正在使用 Entity Framework 6 开发 MVC 4 应用程序,但遇到了数据注释问题。无论我使用什么注释,它都不会被验证。 我正在使用以下视图模型来呈现表单:

public class UserViewModel
    {
        [Required(ErrorMessage = "First Name is required")]
        [Display(Name = "First Name")]
        [StringLength(100, MinimumLength = 2)]
        public string FirstName { get; set; }
        ...
    }

在视图中:

@Html.LabelFor(m => m.FirstName)
@Html.EditorFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)

它会被渲染:

<label for="FirstName">First Name</label>
<input class="text-box single-line" id="FirstName" name="FirstName" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="FirstName" data-valmsg-replace="true"></span>

当我单击提交按钮时,不会触发客户端验证,并且在控制器中 ModelState.IsValid 为 true。

更新:

控制器:

[HttpGet]
        public ActionResult Edit(int? Id)
        {
            var model = _userService.GetUserById(Id);
            return View(model);
        }

        [HttpPost]
        public ActionResult Edit(UserViewModel model)
        {
            if (ModelState.IsValid == true)
            {
                _userService.Save(model);
                return View(model);
            }

            return View(model);
        }

【问题讨论】:

  • 你能从你的控制器动作中发布代码吗?
  • 您是否在视图中包含了 javascript 文件?
  • 你是通过ajax加载表单吗?
  • @Fals :是的,我包含了这个 javascript:
  • @CodingDawg :不,不使用 ajax。

标签: asp.net-mvc validation


【解决方案1】:

问题是你发布到你的控制器,你映射到User对象,而不是UserViewModel。这是未触发服务器端验证的原因之一。

至于客户端验证,我不确定,但可能是同样的错误 - 您的视图基于 User 类型,而不是 UserViewModel

所以你的控制器应该是这样的:

[HttpGet]
public ActionResult Edit(int? Id)
{
    var model = _userService.GetUserById(Id);
    var viewModel = new UserViewModel() 
        {
            FirstName = model.FirstName,
            LastName = model.LastName,
            // other properties
        };
    return View(viewModel);
}

[HttpPost]
public ActionResult Edit(UserViewModel viewModel)
{
    if (ModelState.IsValid == true)
    {
        var model = new User()
        {
            FirstName = viewModel.FirstName,
            LastName = viewModel.LastName,
            // other properties
        };

        _userService.Save(model);
        return View(model);
    }

    return View(model);
}

在你的Edit.cshtml 之上,你应该有@model UserViewModel

希望对你有帮助

【讨论】:

  • 昨天我有你所说的 UserViewModel,但试图解决这个问题,我将它更改为 User,但当我在这里复制它时忘记更改它。它的作用相同。
  • 在这种情况下,您需要向我们展示您的视图和类的完整列表,否则没有足够的信息来解决问题。
【解决方案2】:

重新创建我的项目后,我发现问题出在 Ninject.Web.MVC dll 上。我没有在我的项目中使用这个 dll,所以我删除了它并且它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多