我正在动态渲染一些输入控件。我写了一个这样的方法
public override MvcHtmlString GetActionControl(HtmlHelper<ItemDetailsViewModel> helper)
{
return
helper.EditorFor(A => A.Triage.ProcessNumber) +
helper.ValidationMessageFor(a => a.Triage.ProcessNumber, "*")
}
我从主CSTHML文件中调用它,如下所示:
<!-- Render Action Controls for each possible action -->
@foreach (IActionControl iac in WorkflowActionControls.GetActionControls(Model.WorkflowItem.CurrentState))
{
<div id="@("div" + iac.ControlName)" class="ui-corner-all ui-widget ui-widget-content" style="margin-top: 24px; padding: 15px;">
@iac.GetActionControl(this.Html)
</div>
}
请注意,我正在将当前的HtmlHelper传递给GetActionControl()方法。
问题是,生成的输出仅为:
<input class="text-box single-line" id="Triage_ProcessNumber" name="Triage.ProcessNumber" type="text" value="" />
即,没有“扩展”验证字段,也没有验证。另外我发现helper.ValidationMessageFor()方法返回NULL。
但是,如果我将编辑器和validationMessage直接放在.cshtml上,一切都像魅力一样:
@Html.EditorFor(a => a.Triagem.ProcessNumber)
@Html.ValidationMessageFor(a => a.Triagem.ProcessNumber, "*")
我在这里做错了什么?不应该调用HtmlHelper.EditorFor的最终结果是一样的吗?如果这是一个蹩脚的问题,我很抱歉,但关于MVC 3动态生成HTML标记的信息不多。
我检查了常见的陷阱,一切正常:在web.config上启用验证,模型类具有适当的验证属性等。
非常感谢任何帮助:)
PS:我简化了粘贴代码并省略了表单。
答案 0 :(得分:3)
我不知道这是否会对您有所帮助,但在Html.ViewContext.FormContext
不为空时会进行验证。当我遇到同样的问题时,我只是使用new FormContext();
初始化表单上下文并且它有效