MVC-将泛型模型传递给方法



我有一个函数FillPdf(),我正在用它来填充一个可编辑的pdf。现在我已经定义了它的参数类型,但我有三种不同的形式,每种形式都有不同的模型,所以我想要的是我的这个FillPdf()接收相应的模型并使用它的数据。如何实现这一点。

填充Pdf.cs

  public static bool FillPdf(M2HDetail m2HUserDetails)
    {
        try
        {
            if (PdfFileSettingViewModel.M2HAuthorizationFormLocation == null)
                return false;
            var pdfReader = new PdfReader(PdfFileSettingViewModel.M2HAuthorizationFormLocation);
            var sb = new StringBuilder();
            foreach (DictionaryEntry de in pdfReader.AcroFields.Fields)
            {
                sb.Append(de.Key.ToString() + Environment.NewLine);
            }
            var newFile = Path.Combine(PdfFileSettingViewModel.TempFolderLocation, string.Format("{0}_{1}.pdf", "M2HForm",SessionItems.UserId));
            System.IO.File.Copy(PdfFileSettingViewModel.M2HAuthorizationFormLocation, newFile);
            var pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));
            var pdfFormFields = pdfStamper.AcroFields;
            var totalFields = pdfFormFields.Fields.Count;
            var myParams = new List<string>();
            #region # SetPdfFields #
            pdfFormFields.SetField("Text1", m2HUserDetails.LastName);
            pdfFormFields.SetField("Text2", m2HUserDetails.FirstName);
            pdfStamper.FormFlattening = false;
            #endregion
            pdfStamper.Close();
            return true;
        }
        catch (Exception ex)
        {
            var files = System.IO.Directory.GetFiles(PdfFileSettingViewModel.TempFolderLocation);
            foreach (var file in files)
            {
                System.IO.File.Delete(file);
            }
            return false;
        }
    }

呼叫者功能

 public ActionResult AuthorizationForm(M2HDetail model)
    {
      var isFillPdfSuccess = PdfFiller.FillPdf(model);
      return View();
     }

现在我想我可以使用相同的pdf方法来处理我的另一个表单,如下所示:

 public ActionResult AuthorizationFormHippa(HippaAuthForm model)
    {
      var isFillPdfSuccess = PdfFiller.FillPdf(model);
      return View();
     }

此外,我希望我的pdf方法可以有这样的模型参数:

  public static bool FillPdf(ModelForm model)
{
 }

请建议如何实现这一目标。因为我将来可能有3个以上的表单,每次我都必须用不同的参数类型编写相同的方法。

就我个人而言,我会创建一个通用接口

public interface IPdfContent
{
    // Add your common properties here
}

然后让你的所有模型实现这个接口

public class HippaAuthForm : IPdfContent
{
}

现在,对于你的PdfFill类,你可以这样做:

public static bool FillPdf(IPdfContent m2HUserDetails)
{
    ...
}

因为FillPdf现在期望Interface,所以现在可以将它传递给任何实现该Interface的人。现在,您无需做任何工作即可创建新模型。

只需实现接口!

这也将允许你模拟你的模型,你可以更容易地进行单元测试,因为你现在已经有了DI。

我认为您的标题提供了解决问题的线索。

你所要做的就是

  1. 创建一个通用模型,让我们称之为PdfDetailsModel。这个模型类应该包含FillPdf()方法中必须包含的信息
  2. 创建从PdfDetailsModel派生的特定模型类。该特定类将包含服务请求所需的附加信息。让我们称之为PdfDetailsHippaAuthModel
  3. PdfDetailsHippaAuthModel传递给接受基类对象的FillPdf方法
  4. 由于FillPdf()依赖于基类,因此它对任何派生实例都很满意

最新更新