我正在开发一个应用程序,我希望用户能够输入与任何输入字段关联的注释。例如,用户可以为名为Price
的字段键入值,并在其旁边添加注释以指定在特定条件下可以协商。
我考虑的解决方案是:
Price
和PriceNote
)Field
和Value
的新类(例如Note
),然后将所有模型属性更改为Field
类型。但这两种解决方案都存在缺点。创建其他属性会使代码膨胀并使修改变得笨拙,而创建额外的类则需要不断地对字段值进行类型转换,并在视图中手动处理编辑器/显示。
是否有更好,更优雅的解决方案?
答案 0 :(得分:0)
不确定后端的外观,但您可以创建一个如下所示的对象:
ObjectType,EntityId,FieldName,Comment
这样 - 你可以像往常一样访问price / minQuantity,并且注释存储在一个简单的字符串/字符串字典中。
你也可以在一个完全不同的调用中缓存这些注释......所以你将它们与实际的对象定义分开。
数据存储
同样,根据您的数据库,您可以将注释存储为文本字段中的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; }
}
的表中。由你决定,但我猜你在“每个”表中都不需要它们 - 只是偶尔想要在字段中添加标签/注释。
让我知道中间层(例如 - c#),也许我们可以将json转换为中间层的实际类。
<input ng-model="Price" /><p>{{getComments("Price")}}</p>
作为一个简单的例子。
最后,在Angular / Controller
中对于前端,您可以创建一个返回正确注释的简单属性:
<强> HTML:强>
$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];
}
<强>控制器:强>
{{1}}
或者,你可以创建一个指令来普遍地完成同样的事情(所以你不必在几个控制器中重复代码。
答案 1 :(得分:0)
您可以尝试像这样的类结构
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(但无论如何逻辑上都有道理)
答案 2 :(得分:0)
我找到的最佳解决方案是在模型中创建Dictionary<string, string>
来存储笔记,并使用nameof(MyAttribute)
设置关键字。必须使用TryGetValue()
检索Notes,但它不像常常进行类型转换或重复字段那样笨拙,并且可以从视图中轻松访问。
型号:
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
}