MVC验证 - 服务器端验证不允许使用Kendo重新提交

时间:2015-05-24 17:01:46

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

我们的应用程序(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库构建的。但是,所有控件都会出现症状,而不仅仅是基于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实现来实现。

更新 经过进一步的研究,看起来这与剑道而不是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语句的某个地方,从帖子返回时无法重新绑定。如果我再次手动设置该值并不重要,它将永远不会将其重新发送。

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

2 个答案:

答案 0 :(得分:1)

What you "want" to do is a very basic scenario for MVC with failed validation.

The first one that always catches people is with drop down lists. The posted model, does not contain the list of items, so has to be re-populated after failed validation, and then passed back into the view on return.

When I can't solve things like this I start commenting stuff out and work forwards. So in this case strip your model back to one non-ID property and see if it will work. Then you can try and track down the culprit.

答案 1 :(得分:0)

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

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

这样的事情:

var model = GetActionTemplate();

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