Asp.net mvc mvc将模型对象作为变量传递给reduntant函数

Asp.net mvc mvc将模型对象作为变量传递给reduntant函数,asp.net-mvc,function,razor,model,controller,Asp.net Mvc,Function,Razor,Model,Controller,拥有MVC实体框架项目。 有一个MVC项目,并试图减少我的功能,有几个基本相同。函数正在更新相同的3个字段:操作员、日期和表上执行的函数。每个函数引用不同的表名和字段名。有没有一种方法可以将模型表和字段名传递到函数中,这样就不必为模型中的每个表都提供一个名称 以下是我的职能: internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action) { // Tract

拥有MVC实体框架项目。 有一个MVC项目,并试图减少我的功能,有几个基本相同。函数正在更新相同的3个字段:操作员、日期和表上执行的函数。每个函数引用不同的表名和字段名。有没有一种方法可以将模型表和字段名传递到函数中,这样就不必为模型中的每个表都提供一个名称

以下是我的职能:

  internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action)
    {
        // Tract User Action AggrSpec 
        mts_aggrtest.F_OPRID = struser.ToString().Substring(struser.LastIndexOf("\\") + 1).ToUpper();
        mts_aggrtest.F_DATENT = DateTime.Today;
        mts_aggrtest.F_FUNCT = action.ToString();

        return;
    }



    internal void TrackBoltTest(mts_bolttest mts_bolttest, string struser, string action)
    {
        // Tract User Action mts_meshtest 
        mts_bolttest.T_OPRID = struser.ToString().Substring(struser.LastIndexOf("\\") + 1).ToUpper();
        mts_bolttest.T_DATENT = DateTime.Today;
        mts_bolttest.T_FUNCT = action.ToString();

        return;
     }


    internal void TrackBoltSpec(mts_boltspec mts_boltspec, string struser, string action)
    {
        // Tract User Action mts_meshtest 
        mts_boltspec.TS_OPRID = struser.ToString().Substring(struser.LastIndexOf("\\") + 1).ToUpper();
        mts_boltspec.TS_DATENT = DateTime.Today;
        mts_boltspec.TS_FUNCT = action.ToString();

        return;
    }
这些函数在“编辑/创建”操作的控制器中调用

在创建操作的MTS_aggrspecController中,我有:

     var struser = (Session["myUser"]).ToString();
     b.TrackAggrSpec(mts_aggrspec, struser, "A");
在编辑操作中:

     var struser = (Session["myUser"]).ToString(); 
     b.TrackAggrSpec(mts_aggrspec, struser, "U");
在MTS_aggrtestController中,调用该函数:

     var struser = (Session["myUser"]).ToString(); 
     b.TrackAggrTest(mts_aggrtest, struser, "U");
这似乎是多余的,我知道一定有更好的方法,但我不知道怎么做


我看过其他帖子,但找不到一个似乎适合这个问题的帖子。非常感谢您的帮助,如果您能为我指明正确的方向。

首先,您不需要调用ToString来获取字符串

    mts_boltspec.TS_OPRID = struser
      .ToString()
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    mts_boltspec.TS_FUNCT = Action.ToString();
应该是

    mts_boltspec.TS_OPRID = struser
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    mts_boltspec.TS_FUNCT = Action;
其次,微软指南建议使用小写参数

internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string Action)
应该是

internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action)
最后,您不需要一个空的return语句

internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action)
{
    mts_boltspec.TS_OPRID = struser
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    mts_boltspec.TS_DATENT = DateTime.Today;
    mts_boltspec.TS_FUNCT;
}
有了这些基础知识,您可以使用和将所有这些方法组合成一个方法。为了使其可读,我还将创建一个扩展方法

internal static class TrackAggrTestExtensions
{
  public static void TrackAggrTest<TBoltSpec>(this TBoltSpec instance,
    string struser,
    string funct,
    Action<TBoltSpec, string> assignOprId,
    Action<TBoltSpec, DateTime> assignDateNT,
    Action<TBoltSpec, string> assignFunct) 
  {
    var oprid = struser
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    var datent = DateTime.Today;

    assignOprId(instance, oprid);
    assignDateNT(instance, datent);
    assignFunct(instance, funct);
  }
}

但是,我不确定这是否更好。

您使用的是什么语言和框架?该项目是一个MVC5 C实体框架项目。我确实看到了在哪里可以将模型传递给函数,并且认为这会起作用——只是看不到如何处理不同的字段名。任何帮助都是值得赞赏的。你应该考虑小写参数动作应该是动作。Erik Philips,我甚至没有注意到这是提示。你能把部分字段名作为参数吗?在作业中使用它?也许我可以传递字段而不是模型。
myAggrTest.TrackAggrTest(struser, 
  action, 
  (i, id) => i.F_OPRID = id,
  (i, dt) => i.F_DATENT = dt,
  (i, f) => i.F_FUNCT = f);

myBoltTest.TrackAggrTest(struser, 
  action, 
  (i, id) => i.T_OPRID = id,
  (i, dt) => i.T_DATENT = dt,
  (i, f) => i.T_FUNCT = f);

myBoltSpec.TrackAggrTest(struser, 
  action, 
  (i, id) => i.TS_OPRID = id,
  (i, dt) => i.TS_DATENT = dt,
  (i, f) => i.TS_FUNCT = f);