Шаблон частичного просмотра ASP.NET MVC 3 - PullRequest
4 голосов
/ 21 ноября 2011

Если честно, я понятия не имею, как это назвать или как начать поиск.

У меня есть страница со стандартным макетом.

<div>
    <label for="field">Field Name:</label>
    @Model.Field
</div>

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

Я создал частичное представление со следующим:

@model System.Object
<div>
    @Html.LabelFor(m => m)
    @Html.DisplayFor(m => m)
</div>

На моемДля просмотра я добавил следующее:

@Html.Partial("_BillField", Model.Field)

У модели есть описание, например:

public ModelName {
    [Display(Name="Field Description")]
    public decimal Field { get; set; }
}

Это работает, когда на главном экране, но при использовании метки отсутствуетшаблон.Чего мне не хватает?

Обновление: За @K.Боб Я изменяю частичное представление:

<div>
    @Html.LabelFor(m => m)
    @Html.DisplayFor(m => m)
</div>

Обновление 2: Для ясности того, что я хочу.

В конце я хочу иметь возможностьделать:

@Html.Partial("_BillField", Model.Field1)
@Html.Partial("_BillField", Model.Field2)
@Html.Partial("_BillField", Model.Field3)

И иметь эквивалент:

<div>
    <label for="field1">Field 1 Name:</label>
    @Model.Field1
</div>
<div>
    <label for="field2">Field 2 Name:</label>
    @Model.Field2
</div>
<div>
    <label for="field3">Field 3 Name:</label>
    @Model.Field3
</div>

Извините, что не уточнил это.

Ответы [ 5 ]

2 голосов
/ 21 ноября 2011

Частичное не нужно указывать, что такое @model, оно будет использовать родительский @model, если вы берете @model в частичное, это поможет?

Если у меня есть это как представление ....

@model MyApp.Models.ModelName
@{
    ViewBag.Title = "Test";
}

<h2>Test</h2>
<div>
           <div class="editor-label">
                @Html.LabelFor(m => m.Field)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Field)
                @Html.ValidationMessageFor(m => m.Field)
            </div>
</div>
@Html.Partial("_partial", Model) @*note I pass the whole model*@

А это как частичное ....

@model MyApp.Models.ModelName
<div>
              <div class="editor-label">
                @Html.LabelFor(m => m.Field)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Field)
                @Html.ValidationMessageFor(m => m.Field)
            </div>
</div>

Затем он делает то, что, я думаю, вы хотите сделать (очевидно, он делает это дважды, но вы можете удалить код из основного представления). Я не уверен, что это дает вам огромную выгоду, хотя. Может быть, я что-то неправильно понял.

1 голос
/ 22 ноября 2011

Я думаю, что потенциально вы должны использовать шаблоны Display / Editor для типов, ваша модель включает в себя 3 поля этого типа.

@Html.Partial("_BillField", Model.Field1)
@Html.Partial("_BillField", Model.Field2)
@Html.Partial("_BillField", Model.Field3)

Определение шаблона для типа, а не для частичного представления, возможно, более эффективно. Для подробного сравнения смотрите ASP.NET MVC 3 - Частичное или шаблон отображения против шаблона редактора .

В этом случае ваш вид будет выглядеть примерно так:

@Html.DisplayFor(model => model.Field1)
@Html.DisplayFor(model => model.Field2)
@Html.DisplayFor(model => model.Field3)

Ваша модель будет:

public class model
{
   [DisplayName("Field1")]
   public ComplexType Field1 {get;set;}
   [DisplayName("Field2")]
   public ComplexType Field2 {get;set;}
   [DisplayName("Field3")]
   public ComplexType Field3 {get;set;}
}

Или аннотация данных для отображаемого имени.

1 голос
/ 21 ноября 2011

Звучит так, будто вы хотите, чтобы DisplayFor (m => m):

http://buildstarted.com/2010/09/10/overriding-displayfor-and-editorfor-to-create-custom-outputs-for-mvc/

Ссылка на функцию: http://buildstarted.com/2010/09/29/htmlhelper-guide-for-mvc-3-part-2/

1 голос
/ 21 ноября 2011

Вам не нужно ToString() вашей собственности.

@Html.LabelFor(m => m)

ОБНОВЛЕНО

В зависимости от того, что вы хотите сделать, повторно используйте представлениявзгляните на этот более длинный, чем обычно, пост о повторном использовании проверки и частичных представлений, которые я написал до ответа для ASP.NET MVC 3 - Проверка модели .Это очень подробно.

0 голосов
/ 22 ноября 2011

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

Вам нужно будет назвать его немного иначе, чемкак вы предложили, потому что вам нужно использовать синтаксис m=>m.Field.Но я уверен, что это должно делать то, что вам нужно, без необходимости использовать частичное представление.

Если вы используете синтаксис Model.Field, вы будете отправлять только фактическое значение свойства Field, например 1.23 для вашегодесятичный, вам нужно использовать m=>m.Field, чтобы получить больше, чем просто оценку свойства, чтобы вы могли изменить текст в метке.

...