Как я могу использовать методы Html.TextAreaFor () в моем собственном HtmlHelper? - PullRequest
1 голос
/ 20 октября 2010

Я создаю веб-сайт ASP.NET MVC 2 и сейчас у меня есть ужасный код спагетти, который я хотел бы превратить в собственный HtmlHelper. Текущий код в представлении:

            <%switch (Model.fiFieldTypeID) %>
            <%
            {
                case 1: // Text area
                    Response.Write(Html.Encode(Html.TextAreaFor(model => model.fiStrValue)));
                    Response.Write(Html.Encode(Html.ValidationMessageFor(model => model.fiStrValue)));
                    break;
                case 2: // Text box
                    Response.Write( Html.Encode(Html.TextBoxFor(model => model.fiStrValue)));
                    Response.Write( Html.Encode(Html.ValidationMessageFor(model => model.fiStrValue)));
                    break;
etc....

Я пытался инкапсулировать этот код в аккуратный маленький HtmlHelper. Вот как я начал:

public class FormHelpers
{
    public static MvcHtmlString GetStreamFieldEditor(this HtmlHelper html, FieldInstance field)
    {
        string output = "";
        switch (field.fiFieldTypeID)
        {
            case 1: // Text area
                output += html.TextAreaFor(field=> field.fiStrValue).ToString();
etc....

Я знаю, что моя лямда не права ... но меня больше беспокоит то, что TextAreaFor не доступен как метод. Тем не менее, старый добрый TextArea доступен. Я не хочу использовать TextArea, потому что мне нужно сохранить привязку моей модели. Как я могу использовать TextAreaFor, TextBoxFor и т. Д. В своем настраиваемом помощнике по html?

Ответы [ 2 ]

4 голосов
/ 20 октября 2010

Как насчет этого:

public static class FormHelpers
{
    public static MvcHtmlString GetStreamFieldEditor(
        this HtmlHelper<YourModelType> html)
    {
        var model = html.ViewData.Model;
        if (model.fiFieldTypeID == 1)
        {
            return html.TextAreaFor(x => x.fiStrValue);
        }
        return html.TextBoxFor(x => x.fiStrValue);
    }
}

А потом:

<%: Html.GetStreamFieldEditor() %>
<%: Html.ValidationMessageFor(x => x.fiStrValue) %>
0 голосов
/ 20 октября 2010

Добавить using System.Web.Mvc.Html.
РЕДАКТИРОВАТЬ : убедитесь, что вы ссылаетесь на System.Web.Mvc.dll v2.0 или выше.

Чтобы исправить лямбду, вам нужно вручную сгенерировать дерево выражений, используя System.Linq.Expressions.

...