【问题标题】:Validation of the MVC5 View Model does not reach the controllerMVC5 视图模型的验证未到达控制器
【发布时间】:2020-06-06 00:31:27
【问题描述】:

我有一个 Asp.Net MVC5 项目,当在 ViewModel 上使用 requires 属性时,如果 ViewModel 无效,我无法访问我的控制器。但是,它只发生在特定的屏幕上。

我需要这样,即使使用错误的 VM,此请求也会到达我的控制器,以便在我的视图中执行另一个操作(在这种情况下,一个微调器被隐藏)。

我的代码示例:

视图模型:

public class ParameterizationViewModel 
{

        /// <summary>
        /// Name of Parameterization.
        /// </summary>

        [Required(ErrorMessageResourceName = "LabelErrorFieldRequired", ErrorMessageResourceType = typeof(ResourcesGSC.Language))]
        [Display(Name = "LabelName", ResourceType = typeof(ResourcesGSC.Language))]
        public string Name { get; set; }
} 

控制器:

public class ParameterizationController : BaseController
    {
        [HttpGet]
        public ActionResult Index(string id)
        {
            var model = new ParameterizationViewModel();

            if (String.IsNullOrEmpty(id))
            {
                //Code omitted
                //Here, I structure my model to be a clean view
            }
            else
            {
                //Code omitted
                //Here, I structure my model to be a screen filled with recovered data
            }
            return View(model);
        }

        [HttpPost]
        public ActionResult Index(ParameterizationViewModel model)
        {
            if (!ModelState.IsValid)
            {
                //Here, I validate my ViewModel. I need you to get here, but it doesn't. 
                return View(model);
            }
            //Code omitted
            //Here, follow the flow of persistence with WebService
        }
    }

查看:

@model Project.Models.Parameterization.ParameterizationViewModel

@{
    ViewBag.Title = ResourcesGSC.Language.LabelParameterizationMenu;
}


@using (Html.BeginForm("", "Parameterization", FormMethod.Post, new { }))
{
    <div class="form-group">
        <div class="row mb-3">
            <div class="col-lg-6 col-md-12">
                @Html.LabelFor(m => m.Name, new { })
                @Html.TextBoxFor(m => m.Name, new { @class = "form-control", placeholder = "" })
                @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>

    <div class="row mb-3">
        <div class="col">
            <button type="submit" class="btn btn-primary float-right">
                @ResourcesGSC.Language.LabelBtnSave
            </button>
        </div>
    </div>
}

我不明白会发生什么。我在其他几个部分有相同的代码,效果很好。

我已经搜索了所有我得到的东西,但我无法解决它......

有人可以帮忙解决这个问题吗?

此外,验证消息会显示在屏幕上。但我无法访问我的控制器,因为它发生在其他屏幕上

【问题讨论】:

  • 那么有效的虚拟机确实可以进入您的控制器吗?是您不想要的客户端验证吗?
  • 是的,如果我的虚拟机有效,它会到达我的控制器。我不知道如何准确地向你解释。发生客户端验证,但我需要它首先到达我的控制器。我想我可以说我不想要 Fail Fast Validation 之类的东西,我认为这就是正在发生的事情......我不知道这对你是否有意义,但如果你得到了,我可以尝试更好地解释它困惑。
  • 您可以尝试将HtmlHelper.ClientValidationEnabled = false; 添加到您的视图中(在ViewBag.Title 部分应该没问题),看看它是否得到您期望的结果?
  • 它的工作!谢谢zgood !!!你能给我解释一下为什么吗?我的项目中有很多其他视图,我不必这样做并且按预期工作。只有这种观点让我陷入困境..
  • 错过了 3 分钟...哈哈。

标签: asp.net .net asp.net-mvc-5


【解决方案1】:

客户端验证似乎在您不希望的情况下妨碍您。默认情况下,如果您使用 MVC 样板代码,它将自动设置并为您的表单打开客户端验证。这将在 javascript 中验证客户端上的必填字段等内容,并防止表单在未通过此客户端验证时发布到服务器。

您可以在此处阅读它的工作原理:https://www.blinkingcaret.com/2016/03/23/manually-use-mvc-client-side-validation/(这篇文章讲述了如何手动使用它,但很好地解释了它的工作原理)

但如果您想在控制器中处理所有服务器端验证,您可以通过以下几种方式禁用客户端验证:

  • 在您的捆绑配置中删除对jquery.validate.jsjquery.validate.unobtrusive.js 的脚本引用

  • &lt;add key="ClientValidationEnabled" value="false"/&gt;&lt;add key="UnobtrusiveJavaScriptEnabled" value="false"/&gt; 添加到&lt;appSettings&gt; 节点下的weeb.config

  • HtmlHelper.ClientValidationEnabled = false;HtmlHelper.UnobtrusiveJavaScriptEnabled = false; 添加到各个视图或操作中

【讨论】:

    【解决方案2】:

    不要使用 jQuery 验证器。它将检查验证错误,并且在验证失败时不会让请求到达您的控制器。既然您说正在发生客户端验证,我只能猜测是这种情况。禁用 jQuery 验证器,即使您的视图模型无效,请求也会到达控制器。

    如果您使用了 mvc 5 项目的默认模板,请在 bundle.config 文件中查找它。在那里你可以评论它。

    【讨论】:

    • 谢谢桑杰!!你的回答也是正确的。但是,zgood 补充了一个更完整的答案,将来可以帮助更多的人。还是谢谢你!
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2011-07-15
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2014-02-12
    相关资源
    最近更新 更多