razor视图模型中字段的条件视图
本文关键字:视图 条件 字段 模型 razor | 更新日期: 2023-09-27 18:12:21
我有以下视图模型来查询我的表:
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:显示所有字段。
短:显示姓名、LastName、Address、MaxAge。
Small:显示Name, LastName。
是否有任何方法可以放置某种DataAnnotation来确定在视图或其他方式中显示哪些字段?,避免在每个字段后面加上"what if?"
谢谢。
这可能有点过分了,事实上我更倾向于@Mystere Man的答案,但这是另一种选择。
在ViewModel中设置它们以满足逻辑,而不是常规的基本类型。看起来Name和LastName总是显示,而Address和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
的值设置嵌套视图模型和Address和MaxAge的布尔值。
然后,让你的视图像这样:
/视图/Questions.cshtml
@model QuestionViewModel
@Html.DisplayForModel()
然后为QuestionViewModel
创建一个自定义显示模板(或编辑器模板,如果这是一个表单):
/视图/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语句,没有循环,并且你的主视图和第一级模板保持干净。
为了保持简单,并避免视图中复杂的if逻辑,只需创建三个不同的视图,每个视图中只包含所需的数据。然后根据问题类型选择控制器中的视图。
基于此链接和此链接
控制器:
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>
}
}
}