Создание пользовательских элементов интерфейса en MVC 3 - PullRequest
2 голосов
/ 09 июня 2011

В моем проекте есть требование, чтобы определенные поля, зависящие от определенного условия, были доступны для редактирования или только для чтения.

Так что я решил, что делать это для каждого поля было излишним

@if (Model.CanEdit)
{ 
    @Html.TextBoxFor(model => Model.Foo, new { width = "100px" })
}
else
{ 
    @Html.TextBox(model => Model.Foo, new { width = "100px", @readonly = "readonly"})
}

Я решил использовать шаблон редактора, но потом понял, что ширину нельзя исправить, поэтому мне было интересно, как лучше всего отправить параметры в шаблон редактора?Также он должен обрабатывать сценарий, что ширина не может быть определена и не использовать свойство ширины вообще.Я обнаружил, что ViewData может помочь с этим, но наличие кода, который выглядит так, заставляет меня чувствовать, что я делаю что-то не так.

@inherits System.Web.Mvc.WebViewPage<string>
@if (Model.CanEdit)
{ 
    @if(ViewData["width"] == null)
    {
        @Html.TextBox("", Model, new { width = ViewData["width"].ToString() })
    }
    else
    {
        @Html.TextBox("", Model)
    }
}
else
{ 
    @if(ViewData["width"] == null)
    {
        @Html.TextBox("", Model, new { width = ViewData["width"].ToString() , @readonly = "readonly"})
    }
    else
    {
        @Html.TextBox("", Model, new {@readonly = "readonly"})
    }
}

Интересно, может ли быть способ создать помощника, чтобы яможет сделать что-то вроде:

@MyTextBoxFor(model => Model.Foo, true) @* true would be or readonly *@
@MyTextBoxFor(model => Model.Foo, true, 100) @* 100 would be the width length *@

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Ответ kapsi великолепен, но если вы хотите использовать своего помощника в строго типизированном представлении, вот основной синтаксис. Это немного небрежно, но вы можете добавлять перегрузки по своему усмотрению.

public static class MyHelpers
{
    public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression, 
        bool flagReadonly,
        int? widthProperty) where TModel : class
    {
        MemberExpression memberExpression = expression.Body as MemberExpression;
        string parameterName = memberExpression.Member.Name;

        return new MvcHtmlString(
            string.Format("<input id=\"{0}\" name=\"{0}\" {1} {2} />",
            parameterName, // name and if of parameter
            flagReadonly ? "readonly=\"readonly\"" : string.Empty,
            widthProperty.HasValue ? 
                string.Format("width=\"{0}px\"", (int)widthProperty) : 
                string.Empty));
    }
}

Конечно, таким образом, вам предоставляется возможность строго набирать элементы представления

@Html.MyTextBoxFor(model => model.Foo, true)

и

@Html.MyTextBoxFor(model => model.Foo, true, 100)

и т.д.

2 голосов
/ 09 июня 2011

Простой пример:

public static class MyHelpers
{
    public static MvcHtmlString MyTextBox(this HtmlHelper htmlHelper, string name, string value = "", bool canEdit = false, int width = 100)
    {
        if (canEdit)
        {
            return htmlHelper.TextBox(name, value, new { width = width.ToString() + "px" });
        }
        else
        {
            return htmlHelper.TextBox(name, value, new { @readonly = "readonly", width = width.ToString() + "px" });
        }
    }
}

Затем зарегистрируйте класс в web.config или используйте оператор использования

@using test.Helpers
@Html.MyTextBox("test")
@Html.MyTextBox("test", "asdf")
@Html.MyTextBox("test", "asdf", true, 500)

Результат:

<input id="test" name="test" readonly="readonly" value="" type="text" width="100px">
<input id="test" name="test" readonly="readonly" value="asdf" type="text" width="100px">
<input id="test" name="test" value="asdf" type="text" width="500px">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...