在剃刀的视图模型中的字段的条件视图

时间:2011-10-24 20:11:58

标签: c# asp.net-mvc-3 razor

我有以下视图模型来查询我的表:

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; }
}

如果我正在进行的查询是类型:

长:显示所有字段 短:显示姓名,姓氏,地址,MaxAge 小:显示姓名,姓氏。

有没有办法放置某种DataAnnotation来确定要在视图中显示哪些字段或以其他方式显示?,以避免出现“假设如何?”对于每个领域。

谢谢。

3 个答案:

答案 0 :(得分:2)

这可能有点矫枉过正,我实际上倾向于@Mystere Man的回答,但这是另一种选择。

而不是ViewModel中的常规基元类型,将它们设置为满足逻辑。看起来名称 LastName 始终显示,而地址 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; }
}

在控制器中,根据CurrentTypeQuestion的值设置嵌套的viewmodel和地址 MaxAge 的布尔值。

然后,让你的视图像这样:

<强> /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创建另一个自定义显示模板:

<强>查看/ DisplayTemplates / ConditionalField.cshtml

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

正如我所说,可能有点矫枉过正,但最后,你只在自定义模板中有一个if语句,没有循环,你的主视图和第一级模板保持干净。

答案 1 :(得分:1)

为了保持简单,并避免视图中的逻辑复杂,只需创建三个不同的视图,只包含每个视图中所需的数据。然后根据问题类型选择控制器中的视图。

答案 2 :(得分:1)

基于此link和此link

控制器:

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

视图模型:

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>
        }
    }
}