处理要为每个模型属性存储的额外数据
本文关键字:存储 数据 属性 模型 处理 | 更新日期: 2023-09-27 18:30:57
我正在开发一个应用程序,我希望用户能够输入与任何输入字段相关的注释。例如,用户可以为名为 Price
的字段键入值,并在其旁边添加注释以指定在特定条件下可协商。
我考虑的解决方案是:
- 为每个字段创建两个属性(例如
Price
和PriceNote
) - 创建一个新类(例如
Field
),包含一个Value
和一个Note
,然后将所有模型属性更改为该Field
类型。
但是,这两种解决方案都有缺点。创建其他属性会使代码膨胀并使修改变得笨拙,而创建额外的类则需要不断进行类型转换字段值并在视图中手动处理编辑器/显示。
有没有更好、更优雅的解决方案?
不确定后端是什么样子的,但你可以创建一个看起来像这样的对象:
{ProductId: 123,
ProductName:'Widget',
Price:200.00,
minQuantity: 10,
Comments:[
Price: "can be reduced blah blah",
minQuantity: "N/A on orders > 1000"
]
}
这样 - 您可以像往常一样访问 price/minQuantity,并且注释存储在简单的字符串/字符串字典中。
您还可以将这些评论缓存在完全不同的调用中......因此,您可以将它们与实际对象定义分开拉取。
数据存储
同样,根据您的数据库,您可以将注释作为 json 存储在文本字段中,也可以将它们规范化存储在包含ObjectType,EntityId,FieldName,Comment
的表中。由您决定,但我猜您不需要"每个"表中的它们 - 只是偶尔想向字段添加标签/注释。
让我知道中间层(例如 - c#),也许我们可以将该 json 转换为中间层中的实际类。
public interface IProduct {
string ProductId {get; set; }
string ProductName {get; set; }
Double Price {get; set; }
int minQuantity {get; set; }
Dictionary<string,string> Comments {get; set; }
}
举一个简单的例子。
最后,在角度/控制器中
对于前端,您可以创建一个返回正确注释的简单属性:
.HTML:
<input ng-model="Price" /><p>{{getComments("Price")}}</p>
控制器:
$scope.getComments = function(fieldNm) {
if($scope.product==undefined
|| $scope.product.Comments.length==0) {
|| $scope.product.Comments.hasOwnProperty(fieldNm)==false) {
return '';
}
return $scope.product.Comments[fieldNm];
}
或者,您可以创建一个指令来通用地完成相同的操作(这样您就不必在多个控制器中重复代码。
你可以尝试这样的类结构
public class Field
{
private string Value;
private string Comment;
}
public class ViewModel
{
private Field Price { get; set; }
private Field SomeOtherFiled { get; set; }
}
一个缺点是访问你必须做的值 Price.Value 或评论 Price.Comment(但无论如何它在逻辑上是有意义的)
我发现的最佳解决方案是在模型中创建一个Dictionary<string, string>
来存储笔记,并使用nameof(MyAttribute)
设置键。注释必须用TryGetValue()
检索,但它比不断类型转换或复制字段不那么尴尬,并且很容易从视图中访问。
型:
public virtual IDictionary<string, string> Notes { get; set; }
视图:
@Html.EditorFor(model => model.Notes[nameof(model.MyAttribute)], new { htmlAttributes = new { @class = "form-control" } })
如果我需要操作笔记:
string myNote;
if (MyModel.Notes.TryGetValue(nameof(MyModel.MyAttribute), out myNote))
{
// Do something with the note
}
else
{
// There is no note for the given attribute
}