如何将不同的ViewModels传递给通用方法?

时间:2018-08-05 07:00:09

标签: c# asp.net-mvc

我有一个用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()不会起作用,但希望它能显示我想要完成的工作。

1 个答案:

答案 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的任何地方。