【发布时间】: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