asp.net mvc бритва повторно использовать представление редактора для отображения (с пользовательским помощником) - PullRequest
0 голосов
/ 26 августа 2011

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

@Html.EditOrDisplayFor(m=>m.Field, isReadonly)

Когда он доступен только для чтения, он отображает только переменную, а когда нет, отображает текстовое поле. Помимо этого помощника мне нужны некоторые if в моих представлениях, но он экономит пару сотен строк кода, если это будет возможно)

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Только что нашел альтернативу (я думаю, довольно аккуратный способ) сделать это:

    public static MvcHtmlString EditOrDisplayFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> p,bool readOnly){
        if (readOnly){
            return new MvcHtmlString(string.Format("{0}", html.DisplayFor(p)));
        }  else{
            return new MvcHtmlString(string.Format("{0}", html.EditorFor(p)));
        }

    } 
1 голос
/ 26 августа 2011

Вы можете сделать две вещи, чтобы помочь вам здесь.

Методы расширения

Первое - это написать метод расширения, который позволяет вам создать поле ввода сваши спецификации, например:

public static class Extensions
{
    public static string EditOrDisplayFor(this HtmlHelper helper, Field field, bool readOnly)
    {
        StringBuilder builder = new StringBuilder();
        if(readOnly)
        {
            builder.Append(field.Value);
        }
        else
        {
            builder.Append("<input type=\"text\" name=\"")
                   .Append(field.Name)
                   .Append("\" value=\"")
                   .Append(field.Value)
                   .Append("\" />");
        }
        return helper.Raw(builder.ToString());
    }
}

, которые вы можете теперь использовать, как вы описали.

Частичное представление

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

...