Условное представление полей в модели представления в бритве - PullRequest
0 голосов
/ 25 октября 2011

У меня есть следующая модель представления для запроса моей таблицы:

QuestionViewModel.cs

public enum TypeQuestion {
   Long = 1,
   Short = 2,
   Small = 3,
}

public class QuestionViewModel
{

    public string Name { get; set; }

    public string LastName { get; set; }

    public string Address { get; set; }

    public string MaxAge { get; set; }

    public string Category { get; set; }

    public string Account { get; set; }

    public TypeQuestion CurrentTypeQuestion { get; set; }
}

, если выполняемый запрос имеет тип:

Long: отображает все поля.Short: отображает имя, фамилию, адрес, MaxAge.Маленький: отображает имя, фамилию.

Есть ли способ поместить какой-либо DataAnnotation, чтобы определить, какие поля отображать в представлении или каким-либо другим способом ?, чтобы не ставить "что, если?"за каждое поле.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Это может быть излишним, и я на самом деле склоняюсь к ответу @Mystere Man, но это другой вариант.

Вместо обычных примитивных типов в вашей ViewModel, установите их для обслуживания логики. Похоже, Имя и Фамилия всегда отображается, в то время как Адрес и MaxAge являются условными.

Итак, настройте вашу ViewModel так:

public class QuestionViewModel
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public IEnumerable<ConditionalField> ConditionalFields { get; set; }
    public string Category { get; set; }
    public string Account { get; set; }
}

public class ConditionalField
{
   public string Field { get; set; }
   public bool Display { get; set; }
}

В вашем контроллере установите вложенную модель представления и логические значения для Address и MaxAge , в соответствии со значением CurrentTypeQuestion.

Тогда сделайте так, чтобы ваш View был таким:

/ Views / Questions.cshtml

@model QuestionViewModel
@Html.DisplayForModel()

Затем создайте пользовательский шаблон отображения (или шаблон редактора, если это форма) для QuestionViewModel:

/ Views / DisplayTemplates / QuestionViewModel.cshtml

@model QuestionViewModel
@Html.DisplayFor(model => model.Name)
@Html.DisplayFor(model => model.LastName )
@Html.DisplayFor(model => model.Category)
@Html.DisplayFor(model => model.Account)
@Html.DisplayFor(model => model.ConditionalFields)

Затем создайте другой пользовательский шаблон отображения для ConditionalField:

Views / DisplayTemplates / ConditionalField.cshtml

@model ConditionalField
@if (Model.Display) {
   @Html.DisplayForModel()
}

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

1 голос
/ 25 октября 2011

На основании этой ссылки и этой ссылки

Контроллер:

public ActionResult Consulta()
{
    return View(new QuestionViewModel());
}

ViewModel:

public enum TypeQuestion {
   Long = 1,
   Short = 2,
   Small = 3,
}

public class QuestionViewModel
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public int MaxAge { get; set; }
    public string Category { get; set; }
    public string Account { get; set; }
    public TypeQuestion CurrentTypeQuestion { get; set; }

    public bool EnabledField(ModelMetadata field)
    {
        //check pending implementation
        return true;
    }
}

Вид:

@model MySite.QuestionViewModel
@using System.Linq;
@using System.Collections;

@{
    ViewBag.Title = "Question";
    Layout = "~/Views/Shared/Layout.cshtml";
}
<h2>Question</h2>

@using (Html.BeginForm(new { id = "FormQuestion" }))
{

    foreach (var prop in ViewData.ModelMetadata.Properties
        .Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm) && ViewData.Model.EnabledField(pm)))
    {
        if (prop.HideSurroundingHtml)
        {
            Html.Editor(prop.PropertyName);
        }
        else
        {
            <div class="editor-label">
                @(prop.IsRequired ? "*" : "")
                @Html.Label(prop.PropertyName)
            </div>
            <div class="editor-field">
                @Html.Editor(prop.PropertyName, prop.Model)
                @Html.ValidationMessage(prop.PropertyName, "*")
            </div>
        }
    }
}
1 голос
/ 25 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...