public class DocumentDetails
{
public int Id {get;set;}
public int TypeId {get;set;}
//Прочие свойства
}
public class AddDocumentItem
{
public int DocumentId {get;set;}
public int MaterialAssetId {get;set;}
public decimal Amount {get;set;}
public decimal Price {get;set;}
}
上述类用作强类型分部视图的模型。
根据文档类型 ( TypeId),我需要显示/隐藏输入价格的字段。
我可以想到 2 种可能的方法来实现这个要求:
- 创建 2 个局部视图并在主视图中解析文档类型并呈现必要的一个,即 就像是
@if(Model.TypeId==условие){@Html.Partial("Первое представление")}else{@Html.Partial("Второе представление")} - 在模型类中,为分部视图
AddDocumentItem添加一个字段DocumentTypeId,为该字段添加一个检查条件(@if(Model.DocumentTypeId==условие){})
2.1.将文档类型值写入 ViewBag.DocumentTypeId 中,在分部视图中解析
但在我看来,这两种选择都不太符合 MVC 的精神:在这两种情况下,视图中都有一些逻辑(需要显示哪个部分视图;显示或不显示输入字段)。
我更倾向于第二种选择,因为在这种情况下只有1 个而不是2 个局部视图(也就是说,至少不会有重复),但我不喜欢这种情况,我将不得不拖动文档类型到模型中。
也许还有其他方法可以解决我提出的问题,一些行之有效的做法/建议?
有必要放弃术语“模型”并将这些类称为“DTO”(数据传输对象)一词,因为与模型不同,本地 DTO 可以任意更改。
之后,选择一个选项的问题将自行消失。
如果你想要美观和通用性,你可以给模型“附加”一个元模型,它描述了要输出哪些字段:
这将允许您从视图中删除确定文档字段组成的逻辑,但将隐藏/显示它们的逻辑留在视图本身中。
在任何情况下,因为 1 个字段而将视图分成两个不同的视图不是一个好主意,因为您要么必须复制整个布局,要么为公共元素创建另一个 100500 个局部视图。