代码之家  ›  专栏  ›  技术社区  ›  rwkiii

如何将不同的视图模型传递给泛型方法?

  •  0
  • rwkiii  · 技术社区  · 6 年前

    我有一个用C#MVC 5编写的项目。有几个控制器/视图可以根据 <input ... 剃刀视野中的田野。

    每个控制器中当前都有逻辑来将输入字段值保存到数据库表中,然后允许检索这些保存的输入值,并用它们填充视图的输入字段。

    这些视图有许多相似之处,因此它们的一些字段在这些模型中是重复的。

    很难在每个保存自己字段的控制器中维护代码,我想使用泛型创建一个保存这些控制器的值的通用例程。

    例如,两个简单的视图模型:

    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()不起作用,但希望它能显示出我想要完成的任务。

    1 回复  |  直到 6 年前
        1
  •  1
  •   David Esteves    6 年前

    有很多方法可以做到这一点。

    您可以有一个公共接口或抽象类,所有视图模型共享该接口或抽象类,该接口或抽象类具有您要保存的属性。那么 SaveToDb 只接受接口而不是泛型类型。然后进入 储蓄银行 您可以从传入的模型访问接口属性的所有属性,并对它们执行任何所需的操作。我想如果你只想让一些属性为空,那么抽象类是有意义的,因为你可以重写你想使用的任何东西 例如

    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包的东西 储蓄银行 SavedInputs 然后将viewmodel映射到 储蓄 . 或者只需手动将其映射到要调用SaveToDb的任何位置。