在视图中具有HTML属性的String.Format()

时间:2012-02-22 22:59:58

标签: asp.net-mvc-3 razor

我有一个模型,其中包含一些继承,但是这就是我想要根据它的类型应用不同的HTML属性。所以我的想法是创建一个属性,我称之为DisplayString,它被用作String.Format的第一个参数。 DisplayString用于允许我执行以下操作:

类:

public class Reaction
{
    public string ReactionString { get; set; }
    public string DisplayString { get; set; }

    public Reaction(string reactionString)
    {
        ReactionString = reactionString;
        DisplayString = "It was {0}!"
    }

    public Reaction(string reactionString, string displayString)
    {
        ReactionString = reactionString;
        DisplayString = displayString;
    }

}

public class GoodReaction : Reaction
{
    public GoodReaction()
    {
        base("awesome");
    }
}

public class BadReaction : Reaction
{
    public GoodReaction()
    {
        base("horrible");
    }
}

public class AverageReaction : Reaction
{
    public GoodReaction()
    {
        base("alright", "It kinda was {0}...");
    }
}

查看:

@model Reaction

@String.Format(Model.DisplayString, "<strong>" + Model.ReactionString + "</strong>");

所以基本上每个子类都有一个我想要显示的字符串,但是我有不同的文本和不同的标记。当然这样做只会导致强大的标签呈现为文本。那么我的选择是什么?随意提出澄清所需的任何问题,希望我能正确地解决我的问题。谢谢!


修改

所以我把它包装在Html.Raw()中就可以了,虽然我确定这样做有些不好我应该对每一块进行编码,然后添加标签,然后是原始的,或者其他东西,但是为了我的目的,它有效。

1 个答案:

答案 0 :(得分:0)

我会为每个具体的类创建一个显示模板,而MVC将足够聪明,可以选择正确的类。

例如,当您调用@Html.DisplayFor(model => model.Reaction),其中Reaction被声明为基类时,MVC将计算出它的类型,然后查找匹配该类型的模板,如果找不到它,它将寻找基本类型的模板,然后最终回退到默认模板。我在申请中做了很多。

听起来你也应该让Reaction抽象,而ctor的受保护