【问题标题】:How can I manually validate a model in the controller after altering the request using ASP.NET MVC 5?使用 ASP.NET MVC 5 更改请求后,如何手动验证控制器中的模型?
【发布时间】:2017-04-03 13:53:55
【问题描述】:

在 ASP.NET MVC 5 框架的顶部编写一个应用程序。

我有一个包含两个单独表单的页面(一个可见,另一个在页面加载时隐藏)。第一个表单有一个下拉菜单,如果用户选择“ABC”选项,我使用 javascript 显示第二个表单。但如果他/她选择任何其他选项,我会隐藏第二种形式。

使用 javascript,我将必填字段的必填属性更改为可选,因为表单不可见。 (这仅对客户端进行)

现在,由于第二个表单在服务器端有一些必填字段,所以每次我提交表单时,ModelState.IsValid 属性总是为 false,因为第二个表单有一些未提供的必填字段。

不知何故,在验证表单之前,我需要通过将 SecondForm 属性设置为 null 然后验证来更改模型。

这是我的ViewModelCapsule 班级的样子

public class ViewModelCapsule
{
    public FirstFormViewModel FirstForm { get; set; }
    public SecondFormViewModel SecondForm { get; set; }
}

我试图通过在我的控制器上使用TryValidateModel() 方法来解决这个问题

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Update(int id, ViewModelCapsule model)
{
    try
    {

        if(model.FirstModel != null && model.FirstModel.Menu1 != "ABC")
        {
            model.SecondModel = null
        }

        if (TryValidateModel(model))
        {
            // Here I am expecting the form to validate since the first form has valid date
            // Do somethig with the request

        }

        return new RedirectAction("Index");

    }
    catch (Exception exception)
    {
        return Content(exception.Message);
    }
}

但由于某种原因TryValidateModel(model) 也返回 false。我评估了传入的数据,FirstForm 在其所有属性中都有正确的数据。

更改请求后如何在控制器中手动验证模型?

【问题讨论】:

  • 如果需要,为什么不直接使用 ajax 加载表单(并且不删除它)?不知道你的意思是什么_我将必填字段的必填属性更改为可选_(这怎么可能?或者你的意思是删除相关的data-*属性)-但这不会从服务器中删除任何[Required]侧面
  • 在任何情况下,视图模型都不应包含数据模型,您最好创建一个视图模型来表示您想要在视图中显示的内容并使用条件[RequiredIf] 属性。
  • 是的,我在客户端更改了aria-required,这样我就可以绕过客户端验证。问题出在服务器端。我如何检查[RequiredIf] 以检查不同的属性?为什么我不能截取请求并将 SecondForm 属性设置为 null 当它应该为 null 时,然后要求框架再次验证表单?
  • aria-required?您没有使用 MVC 的客户端验证吗?使用 foolproof [RequiredIf(..)] 或类似属性(或者如果您想编写自己的 - The Complete Guide To Validation In ASP.NET MVC 3 - Part 2
  • 那你是说我不能只截取控制器中的请求,然后手动调用一个重新验证对象的方法吗?

标签: javascript c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

我相信我现在可以使用它了。我不得不将这行代码添加到我的控制器中

ModelState.Clear();

我的控制器是这样的

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Update(int id, ViewModelCapsule model)
{
    try
    {

        if(model.FirstModel != null && model.FirstModel.Menu1 != "ABC")
        {
            ModelState.Clear();
            model.SecondModel = null

        }

        if (TryValidateModel(model))
        {
            // Here I am expecting the form to validate since the first form has valid date
            // Do somethig with the request

        }

        return new RedirectAction("Index");

    }
    catch (Exception exception)
    {
        return Content(exception.Message);
    }
}

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 2020-06-06
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2010-11-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多