2012-06-08 13 views
5

Vì tôi sử dụng cùng một phím cho TempData nhiều lần, tôi muốn giúp bạn theo dõi các phím này dễ dàng hơn. Nó sẽ là tuyệt vời nếu cuối cùng tôi có thể viết một cái gì đó như thế này:TempData Wrapper

MyTempData.Message = "my message"; 

thay vì

TempData["Message"] = "my message"; 
+0

Làm thế nào về ViewBag thay ? –

Trả lời

7

Âm thanh như bạn muốn có một TempData mạnh mẽ gõ. Một cách để đi về điều đó là viết một Phương pháp mở rộng trên Bộ điều khiển để làm điều đó:

public static class ControllerExtensions 
{ 
    public string GetMessage(this Controller instance) 
    { 
    string result = instance.TempData["Message"] as string; 
    if (result == null) 
    { 
     result = "some default value or throw null argument exception"; 
    } 
    return result; 
    } 

    public void SetMessage(this Controller instance, string value) 
    { 
    instance.TempData["Message"] = value; 
    } 
} 
+0

ném lỗi: tên 'TempData' không tồn tại trong ngữ cảnh hiện tại. – Dmitry

+0

Đã cập nhật thành tiện ích mở rộng phương thức cho tất cả các trình điều khiển. –

+0

hoạt động như một phần mở rộng điều khiển (Tôi đã chỉnh sửa một số lỗi chính tả trong mã của bạn). Nó sẽ là tốt đẹp để có thể lưu trữ TempData bằng cách nào đó trong tài sản của một lớp tĩnh mặc dù. Nếu bạn không thấy bất kỳ cách nào để làm điều đó tôi sẽ đi với đề nghị của bạn. Làm ơn cho tôi biết. – Dmitry

0

Thật khó để biết bạn muốn dữ liệu tạm thời ở mức nào. Giải thích của tôi là có vẻ như bạn muốn có thể có một nhóm thuộc tính được chia sẻ có sẵn trên tất cả các Mô hình Chế độ xem của bạn.

Để thực hiện việc này, kế thừa từ một lớp ViewModel phổ biến.

public class BaseViewModel 
{ 
    public string Message{get;set;} 
} 

public class MyModel : BaseViewModel 
{ 
    public string MyUniquePropety{get;set;} 
} 

Nếu bạn muốn dữ liệu tồn tại trong phiên, sau đó triển khai đơn lẻ và nhớ thêm câu @using vào chế độ xem của bạn để tham chiếu.

0

Bạn có thể bắt chước những gì ViewBag thực hiện.

Đầu tiên, nó sử dụng lớp kín bên trong được gọi là DynamicViewDataDictionary. Về cơ bản, tôi sẽ tạo một phiên bản cho TempData. Sau đó, chúng ta có thể sử dụng phương pháp khuyến nông để làm cho nó có sẵn trong Controller, WebViewPage vv

public sealed class DynamicTempDataDictionary : DynamicObject 
{ 
    private readonly Func<TempDataDictionary> _tempDataThunk; 

    public DynamicTempDataDictionary(Func<TempDataDictionary> viewDataThunk) 
    { 
     _tempDataThunk = viewDataThunk; 
    } 

    private TempDataDictionary ViewData 
    { 
     get { return _tempDataThunk(); } 
    } 

    public override IEnumerable<string> GetDynamicMemberNames() 
    { 
     return ViewData.Keys; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = ViewData[binder.Name]; 
     return true; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     ViewData[binder.Name] = value; 
     return true; 
    } 
} 

public static class TempBagExtensions 
{ 
    private const string TempBagKey = "__CurrentTempBagDictionary"; 

    public static dynamic TempBag(this ControllerBase controller) 
    { 
     return GetCurrentDictionary(controller.ControllerContext); 
    } 

    public static dynamic TempBag(this WebViewPage viewPage) 
    { 
     return GetCurrentDictionary(viewPage.ViewContext.Controller.ControllerContext); 
    } 


    private static DynamicTempDataDictionary GetCurrentDictionary(ControllerContext context) 
    { 
     var dictionary = context.HttpContext.Items[TempBagKey] as DynamicTempDataDictionary; 

     if (dictionary == null) 
     { 
      dictionary = new DynamicTempDataDictionary(() => context.Controller.TempData); 
      context.HttpContext.Items[TempBagKey] = dictionary; 
     } 

     return dictionary; 
    } 
} 

Trong điều khiển của bạn:

this.TempBag().SomeValue = "Test"; 

Theo quan điểm dao cạo của bạn:

@this.TempBag().SomeValue 

Nếu bạn không nghĩ rằng phương pháp mở rộng là đủ sạch, bạn có thể tạo lớp cơ sở điều khiển của riêng bạn, cũng như các lớp cơ sở của riêng bạn cho các khung nhìn dao cạo sử dụng các thuộc tính tốt đẹp, súc tích ViewBag.

4

tùy chọn Khá công nghệ thấp, nhưng nếu bạn chỉ muốn theo dõi các phím bạn đang sử dụng, bạn có thể chỉ cần tạo một số hằng số:

public static class TempDataKeys 
{ 
    public const string Message = "Message"; 
    public const string Warning = "Warning"; 
    public const string Error = "Error"; 
    // etc 
} 

thì:

TempData[TempDataKeys.Message] = "Some message";