Получить данные из MVC 3 Razor Html Helper - PullRequest
0 голосов
/ 03 августа 2011

У меня особенно интересная проблема с Razor Html Helper, которую я пытаюсь реализовать. Цель этого помощника состоит в том, чтобы принять System.Type, сгенерировать JQuery-валидную форму из свойств этого Типа и связанных атрибутов, а также вернуть строку JavaScript, которая будет использоваться во время выполнения в качестве правил проверки для указанной сгенерированной формы. Я генерирую форму, многократно вызывая @ Html.Raw (), создавая ее, когда я перебираю свойства и атрибуты. Первоначально html-помощник был написан внутри единственного файла, который собирался его использовать, но поскольку это обобщенный и часто используемый помощник, я переместил его в папку App_Code в моем проекте.

Это проблема: я обнаружил, что ViewData не доступен для меня, чтобы возвращать какие-либо данные от помощника, когда этот помощник находится в App_Code. Первоначально у меня было два помощника; один для генерации формы и сжатия строки JavaScript в ViewData, а второй - для того, чтобы взять эту же строку 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 голосов
/ 03 августа 2011

ViewData является частью модели , и вы должны использовать пользовательский помощник HTML, а не помощник Razor.

Примерно так:

public static MvcHtmlString MakeFormAndValidationRule<TModel>(this HtmlHelper<TModel> helper, Type type)
{
   var viewData = helper.ViewData;

   // Your code...
}

Дополнительная информация о пользовательских HTML-помощниках.

Кроме того, я не думаю, что вам следует создавать целую форму и проверять ее с помощью помощника.Это слишком большая ответственность.

Вместо этого рассмотрите возможность разделения ответственности на пользовательский шаблон редактора .

0 голосов
/ 03 августа 2011

Я думаю, что вы хотите создать метод расширения для класса HtmlHelper .Я считаю, что это должно решить вашу проблему с проблемой ViewData.

...