我正在努力实现一个Razor Html Helper的一个特别有趣的问题。此帮助程序的目标是接受System.Type,从Type的属性和关联属性生成JQuery-validate-able表单,以及返回将在运行时用作所述生成表单的验证规则的JavaScript字符串。我通过重复调用@ Html.Raw()来生成表单,在迭代属性和属性时构建它。最初,html帮助程序是在唯一要使用它的文件中编写的,但由于这是一个通用且经常使用的帮助程序,我已将其移动到项目中的App_Code文件夹中。
这就是问题所在:我发现当这个帮助程序在App_Code中时,我无法从帮助程序返回任何数据。最初,我有两个帮手;一个用于生成表单并在ViewData中松开JavaScript字符串,另一个用于获取相同的JavaScript字符串并将其打印到客户端脚本块中的文档中。我希望这个助手不仅可以生成表单,而且还可以在一次传递中给我这个JavaScript字符串,所以不必重复O(n)工作。
原始伪代码:
@helper MakeFormAndValidationRule(Type)
{
//generate form
//write form using @Html.Raw()
//generate validation rules simultaneously
//store validation rules in ViewData
}
@helper WriteValidationRules()
{
@Html.Raw(ViewData["rules"]);
}
<form>
MakeFormAndValidationRule(Type)
</form>
<script>
form.validate(@WriteValidationRules())
</script>
问题:这类案件的“最佳做法”是什么?我可以将验证规则写入DOM以供以后检索,并在运行时使用JQuery魔法将其拉出来,但如果有更好,更清晰的方法,我想知道。
答案 0 :(得分:0)
我想你想要创建一个extension method for the HtmlHelper类。我相信这应该解决您的ViewData问题。
答案 1 :(得分:0)
ViewData是模型的一部分,您应该使用自定义HTML帮助程序,而不是Razor帮助程序。
这样的事情:
public static MvcHtmlString MakeFormAndValidationRule<TModel>(this HtmlHelper<TModel> helper, Type type)
{
var viewData = helper.ViewData;
// Your code...
}
More info on custom HTML helpers.
另外,我认为您不应该生成整个表单并使用帮助程序进行验证。这是太多的责任。
相反,请考虑将责任分为custom editor template。