2014-04-24 2 views
1

J'ai une vue partielle dont je veux afficher un type différent d'élément HTML basé sur une propriété du modèle. La solution que j'ai trouvée est:MVC Parameterized Element

@if (Model.Element == "span") 
{ 
    <span> 
     Some stuff 
    </span> 
} 
else if (Model.Element == "p") 
{ 
    <p> 
     Some stuff 
    </p> 
} 
else 
{ 
    <div> 
     SomeStuff 
    </div> 
} 

Ceci n'est évidemment pas très extensible. Je voudrais écrire quelque chose comme:

<@Model.Element> 
    Some stuff 
</@Model.Element> 

mais cela ne semble pas être autorisé. Y a-t-il un moyen de faire quelque chose comme ça?

(Je sais que cela va un peu contre le grain de MVC comme modèle et donc le contrôleur spécifie HTML. En fait, le type d'élément provient de la vue parent, donc je pense que cela est correct.)

Merci d'avance.

Répondre

1
@Html.Raw("<" + Model.Element + ">") 
Some Stuff 
@Html.Raw("</" + Model.Element + ">") 

Est à peu près aussi simple que possible. Bien que vous puissiez toujours utiliser le TagBuilder:

@{ 
    TagBuilder tb = new TagBuilder(Model.Element); 
    tb.InnerHtml = "Some Stuff"; 
    @Html.Raw(tb.ToString()) 
} 
+0

La réponse de Brad est juste, mais je vous invite à réfléchir sur la séparation des préoccupations. Le modèle MVC devrait être sur le point de séparer le modèle de la vue du contrôleur. Avoir un détail de présentation coincé sur le modèle rompt ce principe. –

+0

Brad - merci. Seul inconvénient avec ceux-ci est que Intellisense ne réalisera pas que vous êtes à l'intérieur et élément, mais je suppose que je peux vivre avec ça. Claudio - comme je l'ai dit, les informations réelles proviennent de la vue parente et ne sont relayées que par le modèle et le contrôleur. Existe-t-il un autre moyen de transférer des informations d'un parent à une vue enfant? Je ne pense pas que ViewBag fonctionnera, car je peux avoir plusieurs instances de la vue partielle dans une seule page. –