2011-12-20 22 views
15

Làm cách nào/Tôi có thể khai báo một đối tượng như @User để nó có thể được tham chiếu toàn cầu ở bất kỳ chế độ xem dao cạo nào bằng @?Làm cách nào để hiển thị đối tượng toàn cầu như @Người dùng trong chế độ xem dao cạo?

Something tương tự như:

_LoginPartial.cshtml:

@if(Request.IsAuthenticated) { 
    <text>Signed In As <strong>@User.Identity.Name</strong> | 

nhưng thay vì tham chiếu đối tượng của tôi:

@if(this && that) { <text>@MyObject.GetData</text> } 
+1

Có phải bạn hỏi làm thế nào để làm @User? Hay bạn đang hỏi làm thế nào để làm @ MyOwnObject? –

+0

Có, @MyOwnObject. – JaJ

Trả lời

25

Bạn có thể thay đổi kiểu cơ sở của một trang Razor để một trong những ví dụ của riêng bạn:

public class UserAwareViewPage : System.Web.Mvc.WebViewPage 
{ 
    public IPrincipal User { get { return Thread.CurrentPrincipal; } } 
} 

Và sau đó sửa đổi tập tin cấu hình của bạn như vậy:

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, 
    System.Web.Mvc, Version=3.0.0.0, 
    Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="Your.Namespace.UserAwareViewPage"> 
    <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
    </namespaces> 
    </pages> 
</system.web.webPages.razor> 

Phil Haack có một rất tốt blog post on this here.

Hoặc, bạn có thể thêm phương thức tiện ích vào System.Web.Mvc.WebViewPage (loại cơ sở cho các trang dao cạo) và sử dụng phương thức này.

public static IPrincipal User(this System.Web.Mvc.WebViewPage page) 
{ 
    return Thread.CurrentPrincipal; 
} 

Đó sẽ là sử dụng được như vậy:

@if(Request.IsAuthenticated) { 
<text>Signed In As <strong>@User().Identity.Name</strong> 

Cá nhân, tôi thích cách tiếp cận đầu tiên, nhưng nghĩ rằng tôi muốn cung cấp thứ hai cho một lựa chọn thay thế.

+2

'SharedViewPage' không thực hiện thành viên trừu tượng được thừa hưởng 'System.Web.WebPages.WebPageExecutingBase.Execute() –

3

Cú pháp @ không tham chiếu giá trị theo bất kỳ cách nào, nó chỉ cho công cụ xem bạn đang bắt đầu một khối mã phía máy chủ.

Không có gì "toàn cầu" về nó. Trong trường hợp này, User là thuộc tính trên lớp trừu tượng System.Web.WebPages.WebPageRenderingBase, trong đó is used by the view engine khi hiển thị chế độ xem là they inherit from it.

Tôi cho rằng bạn có thể mở rộng các lớp WebViewPage hoặc WebViewPage<> để thêm thuộc tính cho chúng. Có thể có một cách tốt hơn để đạt được những gì bạn đang cố gắng làm mà không sửa đổi chúng. Nếu bạn đang cố chuyển dữ liệu vào Chế độ xem, dữ liệu đó có phải là một phần của ViewModel không?

Tốt nhất bạn nên cung cấp mọi thứ mà Chế độ xem trong Chế độ xem tùy chỉnh và Chế độ xem sẽ kế thừa từ WebViewPage<CustomViewModel>.

Trong cú pháp Razor Tôi nghĩ rằng bạn muốn bắt đầu CSHTML với một cái gì đó như:

@model CustomViewModel 

Sau đó, bạn muốn tính truy cập vào đó bằng cách sử dụng Model tài sản:

@Model.SomeProperty 
2

Bạn có thể có thể làm nội dung như thế này trong Chế độ xem của bạn:

@Html.ViewContext.HttpContext.User.Identity.Name 

Tôi khuyên bạn nên chống lại điều đó tuy nhiên, và thêm thông tin này vào ViewModel.Ví dụ:

public ActionResult SomeController() 
{ 
    var model = new MyViewModel 
    { 
     Username = User.Identity.Name 
    } 
    return View(model); 
} 

Bây giờ bên trong xem bạn có thể hiển thị thông tin này:

@Model.Username 
2

Hoặc cho một cách tiếp cận ít gây khó chịu, và các công trình này cho bất kỳ trang Razor chỉ đơn giản là mặc định:

@Context.User.Identity.IsAuthenticated 

Chắc chắn bạn có thể thiết lập bí danh biến nhanh nếu bạn thích ở đầu tệp Razor (_Layout hoặc cách khác):

@{ 
    var User = Context.User; 
} 

nhưng thực sự không cần thiết trừ khi bạn có một đối tượng custome IPrincipal trong trường hợp đó:

@{ 
    var User = (MyAuthenticatedUser)Context.User; 
} 

và làm việc và là những gì tôi sử dụng :)

+0

Là mới đối với Dao cạo ASP MVC, nó đã bỏ qua tâm trí của tôi rằng tôi chỉ có thể giới thiệu động "globals" hoặc các đối tượng tùy chỉnh một chế độ xem bằng cách sử dụng cách tiếp cận đơn giản như những gì bạn hiển thị trong ví dụ thứ hai của mình. Cảm ơn! – nemesisfixx

Các vấn đề liên quan