【问题标题】:How to reuse the same code in several Display Templates?如何在多个显示模板中重用相同的代码?
【发布时间】:2017-08-12 08:20:22
【问题描述】:

我有 2 个显示模板,它们的几行代码相同。

有没有办法将公共代码移动到另一个文件并在两个模板中引用该文件?

例如:

显示模板#1 和#2 有以下共同代码:

IFormatProvider formatProvider = System.Globalization.CultureInfo.CurrentCulture;
string formattedCurrency = null;

if (formatProvider.ToString().Equals("en-US"))
{
    formattedCurrency = (@Model < 0 ? @Model.ToString("C", formatProvider) : (@Model).ToString("C", formatProvider));
}
else
{
    formattedCurrency = (@Model < 0 ? "- " + @Math.Abs(@Model).ToString("C", formatProvider) : (@Model).ToString("C", formatProvider));
}

如何将其移至单独的文件并从两个模板中引用?

【问题讨论】:

  • 怎么样: - 将formattedCurrency 逻辑移动到viewModel 通用函数? - 创建一个子模板帮助程序formattedCurrencyHelper,它有那段代码并将其包含在每个 DisplayTemplate1 和 DisplayTemplate2 中?只是想法......
  • 我对 MVC 比较陌生,所以只是尝试学习它。是否可以创建相同类型的视图并将模型传递给它,然后从这两个模板中以某种方式调用它?

标签: c# asp.net-mvc displayfor


【解决方案1】:

所以我的第一个选择是将 formattedCurrency 属性作为一个通用函数:

public class LocalizedViewModel {
   private IFormatProvider formatProvider;
   public float Currency { get; set; }
   public string FormattedCurrency () {
     if (formatProvider.ToString().Equals("en-US"))
     {
         return  (this.Currency < 0 ? this.Currency.ToString("C", formatProvider) : (this.Currency).ToString("C", formatProvider));
     }
     else
     {
         return (this.Currency < 0 ? "- " + Math.Abs(this.Currency).ToString("C", formatProvider) : (this.Currency).ToString("C", formatProvider));
     }
   }
  public LocalizedViewModel () {
    formatProvider = System.Globalization.CultureInfo.CurrentCulture;
  }
}

然后从这个基础模型继承两个 ViewModel

public class MyModel1: LocalizedViewModel {
   public MyModel1() : base() {
   }
}

public class MyModel2: LocalizedViewModel {
   public MyModel2() : base() {
   }
}

那么每次你创建一个对象时你都可以访问这个属性:

var myModel = new Model1();
var myModel2 = new Model2();
myModel.Currency = 100;
myModel2.Currency = 200;

现在两个视图模型都将具有 formattedCurrency 以显示在任何视图上,而无需任何额外的视图逻辑。希望这对您有所帮助,并且可能是一个可行的选择。

myModel.FormattedCurrency();
myModel2.FormattedCurrency();

并在任何模板上呈现该属性。同样,这是实现相同结果的替代解决方案。但采用不同的方法。

问候

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2017-09-13
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多