我有一个用C#MVC 5编写的项目。有几个Controller / View基于Razor View中的<input ...
字段执行一组相似的功能。
每个控制器中目前都有逻辑,可将输入字段值保存到数据库表中,以后再允许检索这些保存的输入值,并由它们填充View的输入字段。
这些视图有很多相似之处,因此在这些模型中它们的几个字段是重复的。
在每个保存自己字段的控制器中维护代码变得越来越困难,我想使用泛型来创建一个通用例程来保存任何这些控制器的值。
例如,两个简单的ViewModel:
public class ViewModel1
{
public string Name { get; set; }
public int Unique1 { get; set; }
...
}
public class ViewModel2
{
public string Name { get; set; }
public int Unique2 { get; set; }
...
}
使用的数据库模型:
public class SavedInputs
{
[Key] public int Id { get; set; }
public string Name { get; set; }
public int? Unique1 { get; set; }
public int? Unique2 { get; set; }
}
现在,我想创建一个可以保存ViewModel字段的函数。像这样:
public bool SaveToDb(T model)
{
var inputs = new SavedInputs()
{
Name = model.Name,
Unique1 = model.Unique1,
Unique2 = model.Unique2
}
_db.SavedInputs.Add(inputs);
...
}
然后通过每个控制器的“保存”操作:
public ActionResult SaveInputs(ViewModel1 model)
{
var success = SaveToDb(model);
}
当然...上面的SaveToDb()不会起作用,但希望它能显示我想要完成的工作。
答案 0 :(得分:1)
有很多方法可以做到这一点。
您可以拥有所有视图模型共享的公共接口或抽象类,这些接口或模型具有要保存的属性。然后SaveToDb
仅采用接口而不是通用类型。然后,在SaveToDb
中,您可以从传入的模型访问接口属性的所有属性,并对其进行所需的操作。我想如果您只想让某些属性为null,那么抽象类就很有意义,因为您可以覆盖任何要使用的内容
例如
public abstract class SavedInputsBase
{
public virtual string Name { get; set; }
public virtual int Unique1 { get; set; }
public virtual int Unique2 { get; set; }
}
public class ViewModel1 : SavedInputsBase
{
public override string Name { get; set; }
public override int Unique1 { get; set; }
...
}
public class ViewModel2 : SavedInputsBase
{
public override string Name { get; set; }
public override int Unique2 { get; set; }
...
}
public bool SaveToDb(SavedInputsBase model)
{
var inputs = new SavedInputs()
{
Name = model.Name,
Unique1 = model.Unique1,
Unique2 = model.Unique2
}
_db.SavedInputs.Add(inputs);
}
或者,您可以使用类似Automapper nuget包的方法,并让SaveToDb
使用SavedInputs
,然后将您的视图模型映射到SavedInputs
。或者只是将其手动映射到您要调用SaveToDb的任何地方。