How do I import a namespace in Razor View Page?
Asked Answered
R

12

786

How to import a namespace in Razor View Page?

Reliant answered 13/7, 2010 at 16:3 Comment(2)
You can also add alias to your imported namespace https://mcmap.net/q/55302/-how-to-alias-a-type-with-a-using-directive-in-my-razor-view/…Alver
Check this: codingfusion.com/Post/…Incontinent
R
899

Finally found the answer.

@using MyNamespace

For VB.Net:

@Imports Mynamespace

Take a look at @ravy amiry's answer if you want to include a namespace across the app.

Reliant answered 14/7, 2010 at 9:38 Comment(8)
Also: They can't go in code blocks. (You'll get a runtime error)Neal
Also you don't need the semicolon.No
hi, how to use globalization in view in mvc, as mentioned here ?Hottempered
This is just bad practice period. Please do not add this to the top of your razor pages. This is messy etc... Correct way is to add to Views - web.config just as @Javad_Amiry points out.Scarletscarlett
It's not bad practice. It's an absolutely necessary feature. web.config is like a global using statement that makes the namespace active in ALL your pages. That may not be what you want if you have classes with the same name in different namespaces. You'll still have a conflict if you try to use them in the same file, but you can resolve that easily within a single file. If you stick it in web.config, then the conflict would arise in all your pages that use either of the classes. So calling this bad practice makes no sense at all.Berkey
I'm surprised Intellisense doesn't hint to add the using statement the same way it does in normal C# pages.Berkey
@Berkey It may not be a bad practice, based on the valid examples you provided, however without those conflicts, this definitely isn't the best practice.Hegumen
What if it's narrowed down to not using Imports Mynamespace at all and only use it within the view where necessary? For example, If Mynamespace.objClass Then... without Imports, instead of If objClass Then.... with Imports.Mynamespace.Albuquerque
W
415

The first way is that use @using statement in .cshtml files, that imports a namespace to current file only, and the second:

In the "web.config" file in "Views" directory of your project (notice it is not the main web.config in project's root), find this section:

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      .
      .
      <!-- etc -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

you can add your custom namespace like this:

<add namespace="My.Custom" />

that will add the namespace to all of .cshtml (and/or .vbhtml) files; also you can change views inheritance from here, like:

<pages pageBaseType="My.Custom.MyWebViewPage">

Regards.


UPDATE: Thanks to @Nick Silberstein to his reminder about areas! He said:

If you're working within an area, you must add the namespace within the Web.config under /Areas/<AreaName>/Views/ rather than /Views/

Womanly answered 17/7, 2011 at 9:47 Comment(8)
I don't have that section in my web.config, should I add it?Proudfoot
@Proudfoot : which web.config? the web.config file in Views folder, not the main web.config in root folder. ok?Womanly
I'd like to hopefully save someone a few minutes of pulling out their hair and say that if you're working within an area, you must add the namespace within the Web.config under /Areas/<AreaName>Views/ rather than /Views/.Clevelandclevenger
@MatthijsWessels No it does not need to restart VS. Just build the project and it will take effect. At least I do this always. If a view is open, you have to close that view before build and re-open it after after build.Womanly
@Javad_Amiry, aha, I did rebuild, but didn't close the view.Verified
Using the web.config method of importing prevents polluting views with too many implementation details, like which implementation of a class to use. This assumes two implementations would share the same name but have different namespaces. You could shoehorn in a test-only implementation by using web.config transformations, and a blah.blah.test namespace.Plater
Yes, this is the correct way. Not the Using statement at top of Razor page like in the OP selected answer....Scarletscarlett
Regardless of what Microsoft intended, I consider coding through config files a bad practice -- configs should be for system 'where do I find stuff', or simple parameter changes. I'm surprised that xxx.models and xxx.controllers -- etc doesn't just work, since MVC is based on that kind of magic configuration.Danille
W
34

For Library

@using MyNamespace

For Model

@model MyModel
Wieland answered 19/1, 2016 at 8:3 Comment(2)
Why is there no ; at the end?Flounder
@Flounder because this isn't C# code, it's Razor code. The using at the beginning of a .cs file is a C# compiler keyword. The @using at the beginning of a .cshtml file is a hint to the Razor template engine.Fenland
C
27

In ASP.NET MVC 3 Preview1 you can import a namespace on all your razor views with this code in Global.asax.cs

Microsoft.WebPages.Compilation.CodeGeneratorSettings.AddGlobalImport("Namespace.Namespace");

I hope in RTM this gets done through Web.config section.

Caution answered 28/7, 2010 at 6:47 Comment(2)
There will be a web.config section in RTM, but we also wanted to provide an API to do this because many users are starting to gravitate away from config. So we have both options available for you!Weeden
As of ASP.NET MVC 3 Beta this method no longer works. There is a new web.config section as explained here #3875707 . The AddGlobalImport method for importing a global namespace to all views has been moved to this class System.Web.WebPages.Razor.WebPagesRazorHostPowered
C
16

I found this http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx which explains how to add a custom namespace to all your razor pages.

Basically you can make this

using Microsoft.WebPages.Compilation;
public class PreApplicationStart
{
   public static void InitializeApplication()
   {
       CodeGeneratorSettings.AddGlobalImport("Custom.Namespace");
   }
}

and put the following code in your AssemblyInfo.cs

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "InitializeApplication")]

the method InitializeApplication will be executed before Application_Start in global.asax

Concertante answered 27/4, 2011 at 4:40 Comment(2)
This is actually a rather good answer, but the location of Microsoft.WebPages.Compilation.AddGlobalImport was changed to System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport.Alternant
The big advantage of using this method comes from the fact that the namespace will be usable in all views (including those within areas) while being declared in just one place.Alternant
O
14

One issue that you must know is that when you import a namespace via web.config in Views folder, that namespace is imported JUST for views in that folder. Means if you want to import a namespace in an area views, you must also import that namespace, in that area's web.config file, located in area's Views folder;

Ottie answered 7/9, 2011 at 23:25 Comment(0)
T
12

For namespace and Library

@using NameSpace_Name

For Model

@model Application_Name.Models.Model_Name 

For Iterate the list on Razor Page (You Have to use foreach loop for access the list items)

@model List<Application_Name.Models.Model_Name>

@foreach (var item in Model)
   {  
          <tr>
                <td>@item.srno</td>
                <td>@item.name</td>
         </tr>  
   }
Trommel answered 11/8, 2018 at 12:26 Comment(0)
L
11

You can try this

@using MyNamespace
Lobito answered 1/7, 2017 at 20:54 Comment(0)
R
3

"using MyNamespace" works in MVC3 RTM. Hope this helps.

Rooftree answered 15/1, 2011 at 16:28 Comment(0)
P
3

I think in order import namespace in razor view, you just need to add below way:

@using XX.YY.ZZ
Po answered 3/12, 2015 at 13:39 Comment(0)
G
1

Depending on your need you can use one of following method:

Gosling answered 6/8, 2019 at 10:7 Comment(0)
E
0

in C# you can do it in the following ways

@using Microsoft.AspNetCore.Http;

Equivocation answered 9/11, 2023 at 5:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.