2012-03-04 21 views
26

Tôi có một lớp điều khiển cơ bản:ExecuteCore() trong lớp cơ sở không bị sa thải trong MVC 4 beta

Và tất cả điều khiển khác của tôi được thừa hưởng này BaseClass như thế này

làm việc Tất cả điều này tuyệt vời trong MVC3 (kiểm tra ngày hôm nay , nó thực sự hoạt động) nhưng có vẻ như ExecuteCore trong BaseController không bị bắn nữa trong MVC 4 beta.

Bất kỳ ý tưởng nào? Hoặc bất cứ điều gì lớn đã thay đổi dưới mui xe? Cảm ơn rất nhiều.

public class BaseController : Controller 
{ 
    private string _myData; 

    public string MyData 
    { 
     get 
     { 
      return _myData; 
     } 
    } 

    protected override void ExecuteCore() 
    { 
     _myData = "I am doing something"; 

     base.ExecuteCore(); 
    } 
} 


public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
     ViewBag.MyData = MyData; 
     // Doing something with value in BaseClass 

     return View(); 
    } 
} 

Trả lời

28

Tôi đã có thể tạo lại sự cố của bạn. Có vẻ như việc sử dụng ExecuteCore bị thay đổi. Nhưng tôi không tìm thấy bất kỳ thông tin nào về nó. Tôi đoán nó liên quan đến thực tế rằng bây giờ các Controller thực hiện IAsyncController không phải là AsyncController.

Tuy nhiên tôi đã tìm ra một cách giải quyết để có được những hành vi cũ với MVC4:

Thêm phần này vào BaseContoller:

protected override bool DisableAsyncSupport 
{ 
    get { return true; } 
} 

Từ Trang MSDN cho DisableAsyncSupport (nhấn mạnh thêm bởi tôi):

Cờ này là dành cho khả năng tương thích ngược. ASP.NET MVC 4. cho phép một bộ điều khiển hỗ trợ các mẫu không đồng bộ. Điều này có nghĩa là ExecuteCore không được gọi trên các lớp dẫn xuất. Các lớp học có nguồn gốc có thể ghi đè cờ này và đặt thành true nếu họ vẫn cần ExecuteCore để được gọi.

+5

Cảm ơn đã nhận xét. Có vẻ như đội MVC thực sự đã thay đổi điều gì đó. Tôi có một bước đi khác có thể giải quyết vấn đề này: Thay vì ExecuteCore, tôi ghi đè OnActionExecuting trong BaseClass, được kích hoạt chính xác. – BladeLeaf

+1

Tại thời điểm này, trang MSDN không trống và bao gồm nhận xét sau: "Cờ này là để tương thích ngược. ASP.NET MVC 4. cho phép bộ điều khiển hỗ trợ các mẫu không đồng bộ. Điều này có nghĩa là ExecuteCore không được gọi trên các lớp dẫn xuất. các lớp có thể ghi đè cờ này và đặt thành true nếu chúng vẫn cần ExecuteCore để gọi. " Điều đó có nghĩa là giải pháp/giải pháp của bạn là hợp lệ. – huhu78

28

Tôi đã bỏ phiếu cho câu trả lời vì tôi đã giải thích về những gì đang diễn ra. Tôi có các dự án MVC3 và MVC4 và điều này khiến tôi phát điên.

Tuy nhiên tôi có một giải pháp khác. Ghi đè phương thức khởi tạo trong lớp Bộ điều khiển:

public abstract class BaseController : Controller 
{ 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
    string languageId = "en"; 
    try{ 
     // all your code here. You have access to all the context information, 
     // like querystring values: 
     string languageId = requestContext.HttpContext.Request.QueryString["lang"]; 
     Thread.CurrentThread.CurrentUICulture = 
      CultureInfo.CreateSpecificCulture(languageId); 
    } 
    finally 
    { 
     Thread.CurrentThread.CurrentUICulture = 
     CultureInfo.CreateSpecificCulture(languageId); 
    } 

    base.Initialize(requestContext); 
    } 
} 

Sau đó, trong dự án của bạn, hãy thực hiện tự động chuyển ngữ cảnh yêu cầu. Nó hoạt động cho cả MVC3 và MVC4.

+0

Điều này cũng hoạt động đối với các chất kết dính mô hình tùy chỉnh? Các nền văn bản luồng có được đặt chính xác khi một trình kết nối mô hình được gọi không? – Rookian

+0

Giải pháp của bạn là một cách tiếp cận tuyệt vời Alphonzo. Nó chính xác là giải pháp thay thế đúng cho ExecuteCore() và làm việc với MVC5. Đây là tài liệu MSDN cho Controller.Phương thức khởi tạo: http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.initialize(v=vs.118).aspx – GDB

+0

Rất vui được biết, nhưng nó không hoạt động đối với tôi khi tôi cần truy cập vào bối cảnh db của tôi và một biến phiên, mà chưa được khởi tạo tại thời điểm Initialize được kích hoạt. BeginExecuteCore đã làm công việc cho tôi để thay thế. – ZipionLive

7

Bạn cũng có thể sử dụng BeginExecuteCore

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
{ 
    return base.BeginExecuteCore(callback, state); 
} 
+0

Hoạt động tốt trong MVC 4. Đẹp và đơn giản. –

+0

Bạn vừa lưu lại một ngày cho tôi, cảm ơn! – ZipionLive

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