2009-06-03 43 views
81

Có ai biết làm thế nào nếu có thể xác định xem tên chế độ xem cụ thể tồn tại từ bên trong bộ điều khiển trước khi hiển thị chế độ xem không?Liệu một View Exist trong Asp.Net MVC?

Tôi có yêu cầu tự động xác định tên của chế độ xem để hiển thị. Nếu một chế độ xem tồn tại với tên đó thì tôi cần phải hiển thị chế độ xem đó. Nếu không có chế độ xem theo tên tùy chỉnh thì tôi cần hiển thị chế độ xem mặc định.

Tôi muốn làm điều gì đó tương tự như đoạn mã sau trong vòng điều khiển của tôi:

public ActionResult Index() 
{ 
    var name = SomeMethodToGetViewName(); 

    //the 'ViewExists' method is what I've been unable to find. 
    if(ViewExists(name)) 
    { 
     retun View(name); 
    } 
    else 
    { 
     return View(); 
    } 
} 

Cảm ơn.

+10

Chỉ cần đọc tiêu đề của điều này, nó có vẻ giống như một câu hỏi triết học rất sâu sắc. –

Trả lời

136
private bool ViewExists(string name) 
{ 
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); 
    return (result.View != null); 
} 

Đối với những người tìm kiếm một phương pháp sao chép/dán phần mở rộng:

public static class ControllerExtensions 
{ 
    public static bool ViewExists(this Controller controller, string name) 
    { 
     ViewEngineResult result = ViewEngines.Engines.FindView(controller.ControllerContext, name, null); 
     return (result.View != null); 
    } 
} 
+2

Điều này có lẽ tốt hơn. Tôi đã không biết có một phương pháp FindView tắt của bộ sưu tập ViewEngines chính nó. –

+0

Có vẻ như nó sẽ hoạt động. Cảm ơn Dave. –

+1

Nhưng làm cách nào để kiểm tra xem chế độ xem có tồn tại với bộ điều khiển khác không? – SOReader

15

gì về việc cố gắng giống như sau giả sử bạn đang sử dụng động cơ chỉ có một quan điểm:

bool viewExists = ViewEngines.Engines[0].FindView(ControllerContext, "ViewName", "MasterName", false) != null; 
+0

giống như thế này đã được đăng 3 phút trước khi câu trả lời được chấp nhận và chưa có tình yêu ?! +1 từ tôi. –

+0

@TrevordeKoekkoek ... hmmm ... + 1 –

2

Nếu bạn muốn tái sử dụng điều này trên nhiều hành động điều khiển, xây dựng dựa trên giải pháp do Dave đưa ra, bạn có thể xác định kết quả xem tùy chỉnh như sau:

public class CustomViewResult : ViewResult 
{ 
    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     string name = SomeMethodToGetViewName(); 

     ViewEngineResult result = ViewEngines.Engines.FindView(context, name, null); 

     if (result.View != null) 
     { 
      return result; 
     } 

     return base.FindView(context); 
    } 

    ... 
} 

Sau đó, trong hành động của bạn chỉ đơn giản là trả về một thể hiện của giao diện tùy chỉnh của bạn:

public ActionResult Index() 
{ 
    return new CustomViewResult(); 
} 
5

Đây là một [không nhất thiết phải đề nghị] cách làm việc đó

try 
{ 
    @Html.Partial("Category/SearchPanel/" + Model.CategoryKey) 
} 
catch (InvalidOperationException) { } 
+0

điều này là để kiểm tra sự tồn tại của một phần trong một .cshtml. nó không thực sự là một câu trả lời cho câu hỏi này, nhưng một câu hỏi khác liên kết ở đây đã bị đóng không chính xác nên tôi để lại câu trả lời của tôi ở đây –

+1

Điều này thực sự được sử dụng vì tôi đang tìm cách sử dụng văn hóa cụ thể tầm nhìn hạn chế. Vì vậy, tôi chỉ gọi điều này với tên xem văn hóa cụ thể, và sau đó được gọi là chế độ xem mặc định bên trong cảnh quay.Và tôi đã làm điều này trong một hàm tiện ích, vì vậy tôi không có quyền truy cập vào 'ControllerContext' như là phương thức' FindView' cần. – awe

+4

Kiểm soát lưu lượng dựa trên ngoại lệ là một mùi mã ... – ErikE

1
ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null 

2 cent Mỹ.

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