2010-04-26 30 views
7

ASP.NET MVC - Tôi có thể có nhiều tên cho cùng một hành động không?ASP.NET MVC - Tôi có thể có nhiều tên cho cùng một hành động không?

Trong cùng một bộ điều khiển ... Tôi có thể có nhiều tên cho cùng một hành động không?

Tôi đang tìm một giải pháp đa ngôn ngữ hoàn chỉnh. Về cơ bản tôi muốn tất cả các logic được sa cùng nhưng thay đổi "từ khóa" (hành động, bộ điều khiển trong url) tùy thuộc vào ngôn ngữ.

+0

Bạn không thể đặt Thread.CurrentThread.CurrentCulture, Thread.CurrentThread.CurrentUICulture thay thế? http://msdn.microsoft.com/en-us/library/bz9tc508.aspx –

Trả lời

7

Bạn không thể có nhiều tên cho cùng một hành động. Nó sẽ là những hành động khác nhau. Đây là cách mvc hoạt động. Mabe tốt hơn là nên thực hiện hành vi được mô tả bằng định tuyến.

routes.MapRoute("Lang1RouteToController1Action1", 
"Lang1Controller/Lang1Action/{id}", 
new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

routes.MapRoute("Lang2RouteToController1Action1", 
"Lang2Controller/Lang2Action/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Ofcourse bạn sẽ phải tạo nhiều tuyến, nhưng bạn có thể tạo tệp cấu hình hoặc lưu trữ dữ liệu định tuyến trong cơ sở dữ liệu và chỉ tạo chúng khi bắt đầu ứng dụng. Dù sao tôi nghĩ rằng nó tốt hơn sau đó tạo ra planty của phương pháp, bởi vì nếu bạn sẽ muốn thêm một ngôn ngữ nhiều hơn bạn sẽ cần phải tìm thấy hành động trên tất cả các bộ điều khiển của bạn và biên dịch lại mã. Nhưng trong trường hợp các tuyến đường và tập tin cấu hình - nó trở nên không quá khó. Điều thứ hai là phần mở rộng Html.ActionLink ("Home", "Index", "Home") - bạn sẽ phải triển khai thực hiện của riêng bạn để trả về liên kết hành động được bản địa hóa.

+0

Có ý tưởng này quá, sau khi tôi được đăng. Bạn có nghĩ rằng tôi có thể có tên hành động khác nhau gọi cùng một lớp để làm một cái gì đó và có các lớp học (hành động logic) trong một tập tin khác nhau? – unmircea

+0

Có, bạn có thể. Nhưng như tôi đã nói, điều này sẽ gây đau đớn rất nhiều khi bạn sẽ muốn thêm ngôn ngữ mới. Hơn nữa nó sẽ trông kỳ lạ để xem trong các phương pháp mã được đặt tên theo các ngôn ngữ khác nhau và làm điều tương tự. Tôi thực sự nghĩ rằng định tuyến sẽ được nhiều hơn nữa thích hợp trong trường hợp của bạn, bởi vì nó sử dụng dây. Và mỗi tyme, chúng tôi đều bản địa hoá một thứ gì đó - chúng tôi bản địa hóa các chuỗi - không phải tên của các phương pháp. Nhưng đó chỉ là ý kiến ​​của tôi :) –

2

Tôi không chắc liệu có thể có nhiều tên hành động hay không. Một cách tôi có thể nghĩ về việc này là xác định nhiều hành động với các tên khác nhau mà nội bộ cal/thực thi cùng một hành động.

+0

Giải pháp tốt! Nhưng url "cuối cùng" được tạo ra sẽ có tên của hành động "chính" mà mọi hành động khác gọi. – unmircea

+0

Tôi không nghĩ vậy. Tôi không đề xuất chuyển hướng đến một hành động khác. Bạn có thể chỉ cần thực hiện một hành động khác (đó là một phương thức công khai khác trong lớp điều khiển) và trả về kết quả của nó cho trình duyệt trong khi thực hiện một hành động. – Roman

+0

Ok ... Bây giờ tôi hiểu rồi. Tôi chỉ "quấn" hành động "ngôn ngữ khác" xung quanh một hành động chung, cả hai "làm" cùng một điều Điều này có vẻ hợp lý :) – unmircea

2

Tôi biết tôi là muộn để đảng nhưng ở trong trường hợp ai đó đang googling, tôi tạo ra một thuộc tính (lấy cảm hứng từ ActionName thuộc tính) phù hợp với nhiều tên như sau:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Web.Mvc; 

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class ActionNamesAttribute : ActionNameSelectorAttribute 
{ 
    public ActionNamesAttribute(params string[] names) 
    { 
     if (names == null) { 
      throw new ArgumentException("ActionNames cannot be empty or null", "names"); 
     } 
     this.Names = new List<string>(); 
     foreach (string name in names) 
     { 
      if (String.IsNullOrEmpty(name)) 
      { 
       throw new ArgumentException("ActionNames cannot be empty or null", "names"); 
      } 
      this.Names.Add(name); 
     } 
    } 

    private List<string> Names { get; set; } 

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     return this.Names.Any(x => String.Equals(actionName, x, StringComparison.OrdinalIgnoreCase)); 
    } 
} 

Cách sử dụng:

[ActionNames("CreateQuickItem", "CreateFullItem")] 
public ActionResult Create() {} 
Các vấn đề liên quan