ปัญหาในการรับ AssemblyVersion ในหน้าเว็บโดยใช้ Razor / MVC3


105

ฉันใช้รหัสต่อไปนี้ในส่วนท้ายในไฟล์ _Layout.cshtml ของฉันเพื่อใส่ข้อมูลเวอร์ชัน AssemblyInfo ลงในส่วนท้ายของทุกหน้าในไซต์ MVC3 ของฉัน อย่างไรก็ตาม:

@System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()

เพียงพิมพ์ในส่วนท้าย:

Revision 0.0.0.0

เมื่อฉันแก้ไขมุมมองเพื่อแสดงข้อมูลแอสเซมบลีทั้งหมดสำหรับ "Executing Assembly" โดยใช้สิ่งต่อไปนี้

@System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()

ซึ่งพิมพ์สิ่งต่อไปนี้:

Revision App_Web__layout.cshtml.639c3968.hlogy75x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

สิ่งนี้แสดงให้เห็นว่า "Executing Assembly" ไม่ใช่แอปหลักของฉัน แต่เป็นมุมมองนั้นเอง

ฉันจะรับข้อมูลการประกอบสำหรับแอป ACTUAL ไม่ใช่แค่มุมมองส่วนบุคคลได้อย่างไร

คำตอบ:


219

cshtml / vbhtml เป็นการคอมไพล์แบบไดนามิกไปยังแอสเซมบลี

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version

แล้วเป็นอย่างไรบ้าง?


15
และ@GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionสำหรับ VB.NETers ทั้งหมด เราทั้งคู่.
edhubbell

ฉันต้องแบ่งปันคำชมของฉันด้วย - นี่คือส่วนบนของเรื่องราว "แสดงหมายเลขการแก้ไขในแอปสำหรับ qa" พร้อมกับ [assembly: AssemblyVersion ("1.0. *")] ฉันได้รับหมายเลขบิลด์ที่ดูดี ใช้งานได้ดี
nocarrier

4
สำหรับเว็บไซต์ @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().VersionWebAPI: มันอาจทำงานได้โดยไม่มีเนมสเปซเริ่มต้น:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)ส่งคืนเวอร์ชันแอสเซมบลี 3 ใน 4 ส่วนหากใครสงสัย คุณสามารถเปลี่ยนแปลงได้ระหว่าง 0 ถึง 4
Mafii

1
ใน dotnet core 2.1 สิ่งนี้ใช้ได้กับฉัน: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}แล้ว<h1>Ver. @version</h1>
Leonard AB

16

การใช้ตัวช่วยนี้เหมาะกับฉัน:

    public static HtmlString ApplicationVersion(this HtmlHelper helper)
    {
        var asm = System.Reflection.Assembly.GetExecutingAssembly();
        var version = asm.GetName().Version;
        var product = asm.GetCustomAttributes(typeof(System.Reflection.AssemblyProductAttribute), true).FirstOrDefault() as System.Reflection.AssemblyProductAttribute;

        if (version != null && product != null)
        {
            return new HtmlString(string.Format("<span>{0} v{1}.{2}.{3} ({4})</span>", product.Product, version.Major, version.Minor, version.Build, version.Revision));
        }
        else
        {
            return new HtmlString("");
        }

    }

13

สิ่งนี้ใช้ได้กับฉัน โดยไม่จำเป็นต้องกล่าวถึงประเภทอย่างชัดเจน.

@ViewContext.Controller.GetType().Assembly.GetName().Version

5

คุณต้องได้รับการประกอบประเภทในโครงการ:

typeof(MyType).Assembly.Whatever

ที่ไหนMyTypeเป็นชนิดใด ๆ ในโครงการ MVC ตัวเอง (เช่นตัวควบคุมหรือรุ่นหรือMvcApplicationclass)


นี่เป็นคำตอบที่ดีกว่า IMO เดียวที่ยอมรับเนื่องจากทำให้ชัดเจนว่าคุณกำลังมองหาประเภทที่เป็นส่วนหนึ่งของแอปพลิเคชันของคุณ เรียงลำดับอธิบายสาเหตุของปัญหาได้ดีขึ้น
จิม

4

ขยายคำตอบของ Takepara หากคุณต้องการซับหนึ่งเพื่อรับ AssemblyInformationalVersionAttribute จาก MVC Razor View:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion

1

คุณสามารถลองใช้ GetCallingAssembly () ฉันไม่แน่ใจว่าสูงพอที่ call stack หรือไม่ แต่เนื่องจาก Razor สร้างแอสเซมบลีสำหรับแต่ละมุมมองจริงๆจึงเป็นเหตุผลว่าแอพของคุณจะเป็นแอสเซมบลีการโทรสำหรับแอสเซมบลีมุมมอง


รับแอสเซมบลีการโทรขึ้นไปหนึ่งระดับในต้นไม้ ... ยังไม่ดี
Jay Stevens

1

สำหรับตัวควบคุม api ฉันใช้สิ่งนี้ตามคำตอบอื่น ๆ

Version = GetType().Assembly.GetName().Version.ToString()

0

ปัญหาของฉันคือฉันได้เปลี่ยนชื่อเนมสเปซในภายหลังและฉันได้รับข้อผิดพลาดข้างต้น ปัญหาคือการอ้างอิงเนมสเปซเก่าใน Views \ Web.config ฉันต้องเปลี่ยนจากProject.WebAPI17เป็นCompany.Project.WebAPI17

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Company.Project.WebAPI17" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

-1

คุณสามารถรับได้โดยใช้คุณสมบัติ Name ดังต่อไปนี้:

  @System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

นั่นคือสิ่งที่คุณกำลังมองหา?


-1

ไปที่ Home Controller และคัดลอกรหัสนี้:

เปลี่ยนชื่อActionResultเป็น String

public string Index()

   return typeof(Controller).Assembly.GetName().Version.ToString() ;

run view
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.