【问题标题】:MVC Validation - Server side validation won't allow resubmit using KendoMVC 验证 - 服务器端验证不允许使用 Kendo 重新提交
【发布时间】:2015-05-24 17:01:46
【问题描述】:

我们的应用程序 (MVC5) 有一些非常复杂的验证需要在服务器端完成(复合容量检查、工作流验证等)。我们遇到的问题是,一旦服务器端验证失败并返回相同的视图,客户端就不会再次提交任何字段的值(0 表示 int,空字符串等)

我们的一般模式如下:

public ActionResult PerformSomeAction()
{           
    var model = GetActionTemplate();
    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PerformSomeAction([Bind(Include = ActionTemplate.FIELDS)] ItemTemplate template)
{
    string errorMessage;
    if (ModelState.IsValid)
    {
        bool isValid = ValidateAndPerformAction(template, out errorMessage)
        if(isValid)
            return RedirectToAction("Action", "Controller");
    }

    // Reset non-bound fields from new template
    var model = GetActionTemplate();
    template.FieldValue = model.FieldValue
    return View(template);
}

除了我们的一些编辑器是使用 Telerik Kendo 库构建的这一事实之外,我们的视图并没有什么特别之处。但是,所有控件都会出现这些症状,而不仅仅是基于剑道的控件。

编辑字段的基本视图布局如下:

<div class="form-group">
    @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-3" })
    <div class="col-md-9">
        @Html.Kendo().TextBoxFor(model => model.Name).HtmlAttributes(new
        {
              title = ModelMetadata.FromLambdaExpression(model => model.Name, ViewData).Description
        })
        @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
    </div>
</div>

有人对我们做错了什么有任何建议吗?

注意:虽然有人认为可以通过 AJAX 或其他服务调用来触发此验证,但我们更愿意使用我们正在使用的 post 实现来执行此操作。

更新: 经过进一步研究,这似乎与 Kendo 而不是 MVC 有关。如果我将视图切换为以下内容:

@Html.EditorFor(model => model.Volume)

代替:

    @Html.Kendo().NumericTextBoxFor(model => model.Volume).HtmlAttributes(new
        {
            @class = "",
            title = ModelMetadata.FromLambdaExpression(model => model.PreBoilVolume, ViewData).Description
        }).Value(Model.Volume)

一切似乎都运行良好。因此,在该剑道声明中的某处,它在从帖子返回时无法重新绑定。如果我再次手动设置该值也没关系,它永远不会将其发送回。

我想是时候摆脱一些 Kendo 语句并回到更基本的 UI 了。

【问题讨论】:

    标签: c# asp.net-mvc kendo-ui asp.net-mvc-5


    【解决方案1】:

    您“想要”做的是验证失败的 MVC 的一个非常基本的场景。

    第一个总是吸引人的是下拉列表。发布的模型不包含项目列表,因此必须在验证失败后重新填充,然后在返回时传回视图。

    当我无法解决此类问题时,我会开始评论并继续工作。因此,在这种情况下,将您的模型剥离回一个非 ID 属性,看看它是否可以工作。然后你就可以试着追查肇事者了。

    【讨论】:

    • 查看我的更新了解更多信息。我的下拉菜单工作正常,因为我遇到了您在此过程中前面提到的内容。我要为其他人应该看到的可靠的故障排除项目投赞成票。
    【解决方案2】:

    看起来所选值未在模型上设置。尝试更改这些代码行:

    var model = GetActionTemplate();
    template.FieldValue = model.FieldValue
    return View(template);
    

    到这样的事情:

    var model = GetActionTemplate();
    
    model.Selectedvalues = template.FieldValue ?
    return View(model);
    

    【讨论】:

    • 更改为返回新模型而不是通过该方法传入的模型在手头的问题上没有结果。第一次验证失败后,我仍然没有从第二个帖子中获得值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2012-02-08
    相关资源
    最近更新 更多