views:

174

answers:

1

Here is what I would like to express by Razor:

<b>@parameterMapping.Title</b> (Category: @parameterMapping.Category.Title, Regexp: @parameterMapping.Regexp)

But to make it parseable I have to write it this way:

<b>@parameterMapping.Title</b> <text>(Category: </text> @parameterMapping.Category.Title <text>, Regexp:</text> @parameterMapping.Regexp <text>)</text>

Are there better ways to solve this problem?

+5  A: 

What you wrote down:

<b>@parameterMapping.Title</b>
(Category: @parameterMapping.Category.Title, Regexp: @parameterMapping.Regexp)

Is actually valid in Razor. My guess is that you have all of this in some conditional or iterative statement (if or foreach etc). In this case you can wrap the whole thing in <text>:

@if(Foo) {
  <text><b>@parameterMapping.Title</b>
  (Category: @parameterMapping.Category.Title, Regexp: @parameterMapping.Regexp)</text>
}

Instead of <text> you could use a valid HTML element like <p> or <div>. This is because by default after the { the parser is sitll in "code" mode and needs a markup tag to switch to "markup" mode.

Note that Razor performs tag matching which is why you need to have the whole scope of the if statement contained in a tag if you want all of it to be treated as markup. Otherwise everything that's not inside of a tag would be treated as code:

@if(Foo) {
  // Treate as code
  <text>
    Markup
    <div>More markup</div>
    @EscapeIntoCode
  </text>
  // Treate as code again
}
marcind
marcind, thank you very much for clarification.
Idsa
You said Razor needs a markup tag, but what about <b>?
Idsa
@Idsa any tag will do. `<text>` is a magic tag that does not get rendered to the output.
marcind
But according to the code in my question, <b> tag didn't switch razor to markup mode.
Idsa
@Idsa I added clarification that should answer your question
marcind