为每个模型属性处理要存储的额外数据

时间:2016-01-18 21:40:33

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

我正在开发一个应用程序,我希望用户能够输入与任何输入字段关联的注释。例如,用户可以为名为Price的字段键入值,并在其旁边添加注释以指定在特定条件下可以协商。

我考虑的解决方案是:

  • 为每个字段创建两个属性(例如PricePriceNote
  • 创建包含FieldValue的新类(例如Note),然后将所有模型属性更改为Field类型。

但这两种解决方案都存在缺点。创建其他属性会使代码膨胀并使修改变得笨拙,而创建额外的类则需要不断地对字段值进行类型转换,并在视图中手动处理编辑器/显示。

是否有更好,更优雅的解决方案?

3 个答案:

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