从MVC 3 Razor Html Helper中检索数据

时间:2011-08-02 22:39:47

标签: html asp.net-mvc razor helper

我正在努力实现一个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魔法将其拉出来,但如果有更好,更清晰的方法,我想知道。

2 个答案:

答案 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