2010-03-04 29 views
17

Tôi đã sử dụng T4MVC (FYI: v2.6.62) trong một thời gian và tôi đã từ từ chuyển mã của mình sang cách làm việc này (ít phụ thuộc vào magic strings).Hành động/Hành động T4MVC được đánh máy mạnh

Nhưng tôi phải dừng vì, vì một số lý do, T4MVC không thể dịch các đối tượng thành url và chỉ có thể hoạt động trên các kiểu nguyên thủy (int/string/etc).

Dưới đây là một ví dụ:

Route cố:

/MyController/MyAction/{Number}/{SomeText} 

Class:

namespace MyNamespace 
{ 
    public class MyClass 
    { 
    public int Number { get; set; } 
    public string SomeText { get; set; } 
    } 
} 

Bộ điều khiển:

public class MyController 
{ 
    public virtual ActionResult MyAction(MyClass myClass) 
    { 
    return View(); 
    } 
} 

Xem:

<%= Html.Action(
    T4MVC.MyController.Actions.MyAction(
    new MyClass() 
    { 
     Number = 1, 
     SomeText = "ABC" 
    } 
) %> 

Kết quả cuối cùng là thế này:

/MyController/MyAction?myClass=MyNamespace.MyClass 

và không

/MyController/MyAction/1/ABC 

Có ai khác có vấn đề này? Các url T4MVC như thế này có sẵn không?

Câu hỏi cũng được hỏi tại số ASP.NET Forum.

Trả lời

17

Cập nhật (10/11/2012): hỗ trợ mới nhất cho Trình mô hình hóa (xem phần 3.1 trong doc) hy vọng sẽ bao gồm rất nhiều trường hợp này.

Original câu trả lời:

Sao chép câu trả lời của tôi từ forum thread:

Hmmm, tôi không nghĩ rằng điều này đã đưa ra được nêu ra. Có thể trong hầu hết các trường hợp mọi người có các phương thức Hành động lấy một đối tượng, các giá trị của đối tượng đến từ dữ liệu biểu mẫu được đăng, thay vì được truyền trên URL? Trong kịch bản như vậy, câu hỏi không phát sinh.

Tôi nghĩ về lý thuyết T4MVC có thể được thay đổi để hỗ trợ điều này. Nó sẽ chỉ cần thúc đẩy tất cả các thuộc tính cấp cao nhất của đối tượng như là giá trị tuyến đường chứ không phải cố gắng sử dụng chính đối tượng đó (rõ ràng, hành vi hiện tại là không có thật, và là kết quả của việc gọi ToString() một cách mù quáng).

Có người khác chạy vào điều này và nghĩ rằng nó đáng để giải quyết?

+1

Xin chào David. Cảm ơn vi đa trả lơi. Tôi đoán rằng, với 5 upvotes trong thời gian ngắn nó được lên có nghĩa là đây có lẽ là chức năng mong muốn. :-) –

+0

Ok, tôi sẽ đưa nó vào danh sách TODO! :) –

+0

Cảm ơn bạn! Tôi sẽ thấy nó đặc biệt hữu ích vì tôi đã tạo một vài ActionResults, chẳng hạn như PermanentRedirectResult, sử dụng các hành động kiểu T4MVC và loại chức năng này sẽ rất tuyệt, không chỉ cho việc sử dụng trong các khung nhìn! –

4

Nếu tôi đã hiểu chính xác vấn đề thì cú pháp sau sẽ cho phép bạn khắc phục sự cố.

<%= Html.ActionLink("test", MVC.MyController.MyAction().AddRouteValues(new MyClass() { Number = 5, SomeText = "Hello" })) %> 

Tôi nghĩ rằng câu trả lời cho thực hiện cú pháp đẹp hơn sẽ được quấn mỗi tham số không kiểu giá trị trong một RouteValueDictionary trong từng tạo ra phương pháp kết quả hành động

Edit: (Response to comment như không đủ ký tự)

Ah ok Tôi đã quản lý để tạo lại ví dụ đơn giản ở trên bằng cách sử dụng phương pháp này để cung cấp: /MyController/MyAction/5/Hello làm url. Tôi không hoàn toàn chắc chắn về cách các kiểu phức tạp lồng nhau sẽ được thực hiện. Bạn có thể sử dụng một số đệ quy để đi sâu vào đối tượng cấp cao nhất và phản ánh các giá trị để thêm chúng nhưng sau đó bạn mở ra một tập hợp các vấn đề mới, chẳng hạn như cách đối phó với một tên thuộc tính con giống hệt với cha mẹ tên tài sản. Điều này có vẻ như nó có thể là một vấn đề phức tạp để giải quyết, theo cách mà sẽ làm việc cho tất cả mọi người. Có lẽ một số loại mô hình bộ chuyển đổi sẽ hữu ích nhất để biến đổi một đối tượng phức tạp thành các giá trị tuyến đường. Trong trường hợp đơn giản nhất, điều này có thể là khai báo một phương thức mở rộng ToRouteDictionary hoạt động trên kiểu phức tạp của bạn và biến đổi nó bằng cách sử dụng kiến ​​thức của bạn về cách nó hoạt động. Chỉ cần suy nghĩ to khi tôi rõ ràng không biết về các trường hợp sử dụng của bạn

+0

Tôi e rằng điều này không hiệu quả. Nó trả về giá trị tuyến đường, nhưng url của chúng không được định dạng chính xác. Ngoài ra, nếu nó được cố định bằng cách sử dụng kiểu gói không giá trị này, bạn sẽ cần phải làm như vậy một cách đệ quy, bởi vì ở đó bạn có thể sử dụng loại phức tạp chứa các loại phức tạp khác ... –

+0

được chỉnh sửa để trả lời nhận xét ở trên – PabloBlamirez

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