Razor tidak memahami tag html yang tidak ditutup

99

Dengan RazorViewEngine, saya bisa melakukan ini:

if (somecondition) {
     <div> some stuff </div>
}

tapi sepertinya saya tidak bisa melakukan ini (Razor menjadi bingung):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

Saya mengalami situasi di mana saya harus meletakkan tag html pembuka dan penutup saya di blok kode yang berbeda - bagaimana saya bisa melakukan ini di Razor?

sydneyos
sumber

Jawaban:

161

Coba seperti ini:

if (somecondition) {
    @:<div>
}
Darin Dimitrov
sumber
1
atau <text><div></text>- haacked.com/archive/2011/01/06/...
Simon_Weaver
17
<text><div></text>bekerja, tetapi <text></div></text>tidak.
diam
@Stuntman Anda perlu melakukan ini untuk tag pembuka dan penutup agar berfungsi.
Departamento B
dan bagaimana menangani teks multiline?
Dmitri Tsoy
Saya tidak bisa melakukan ini secara inline. jika (kondisi) {@: tag}. Saya harus memformatnya seperti di atas.
Mike
59

Untuk menjelaskan jawaban Darwin, yaitu mengawali HTML seperti ini:

@:<html>

@: dalam Razor berarti 'menjadikan sesuatu sebagai teks biasa'

atau Anda dapat menggunakan ini, yang menghasilkan HTML seperti yang Anda tulis sebelumnya (ini juga dapat digunakan untuk menghindari pengkodean HTML otomatis yang dilakukan Razor jika Anda mencoba mengeluarkan HTML):

@Html.Raw("<html>")

(Referensi Html.Raw dari MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )

Chris Halcrow
sumber
2
Solusinya bagus, tetapi penjelasannya sangat berharga. Terima kasih!
jay
2
Saya lebih suka solusi @ Html.Raw ("<html>"), karena yang pertama dibagi menjadi multiline saat menggunakan pemformatan otomatis (ctrl + K ctrl + D)
Matteo Sganzetta
@MatteoSganzetta True kecuali apa yang Anda keluarkan memiliki variabel Razor yang ditaburkan ke dalamnya, misalnya:@:<a href="@link" class="@classNames">@text</a>
qJake
Berhati-hatilah saat menggunakan @Html.Raw()- lihat pos SO terkait
SliverNinja - MSFT
4

Anda dapat membuat metode Pembantu MVC khusus. Untuk dengan Anda membuat kelas MyRenderHelpers publik statis di namespace System.Web.Mvc.Htmldan menulis metode Html.

namespace System.Web.Mvc.Html
{
    public static class MyRenderHelpers
    {
        public static MvcHtmlString Html(this HtmlHelper helper, string html, bool condition)
        {
            if (condition)
                return MvcHtmlString.Create(html);
            else
                return MvcHtmlString.Empty;
        }
    }
}

Sekarang Anda dapat menggunakan metode ekstensi ini dalam tampilan pisau cukur Anda:

@Html.Html("<div>", somecondition)
Thomas Hauser
sumber
3

Fakta bahwa Anda harus melakukan ini biasanya menunjukkan bahwa kode tampilan Anda tidak difaktorkan dengan benar. Sifat HTML adalah memiliki tag yang seimbang atau tertutup sendiri (setidaknya di HTML 4, HTML 5 tampaknya menjauh darinya) dan Razor bergantung pada asumsi itu. Jika Anda akan meng-ouptut secara kondisional <div>maka Anda juga akan keluaran di suatu tempat nanti </div>. Masukkan saja pasangan whoel dalam ifpernyataan Anda :

@if(something) {
    <div>
        Other stuff
    </div>
}

Jika tidak, Anda akan berakhir dengan kode aneh seperti di sini .

marcind
sumber
6
Situasi saya adalah bahwa saya ingin
sydneyos
Benar, maksud saya adalah dalam 99% kasus Anda mungkin tidak boleh melakukannya. Tapi Anda mungkin cocok dengan 1% itu dalam hal ini ada @:atau<text></text>
marcind
7
dia mungkin memiliki blok penutupan nanti:if (somecondition) { @:</div> }
Simon_Weaver
ya, dia harus. Maksud saya adalah bahwa pandangan seperti itu dapat difaktorkan ulang sehingga kondisi ganda seperti itu tidak diperlukan.
marcind
1
@ michielvoo Mengapa buruk menggunakan metode ini untuk memiliki pembungkus div bersyarat misalnya? Juga di HTML5 Anda tidak menutup <link>tag.
Chris Haines