2011-02-03 37 views
18

Tôi đang sử dụng asp.net mvc 3 và tôi tiếp tục nhận được lỗi này và tôi không hiểu nó vì tôi không sử dụng mẫu.Nhận lỗi mẫu khi tôi cố gắng thực hiện việc này?

Tôi có điều này theo quan điểm của một phần của tôi

@model ViewModels.FormViewModel 

    <div="tabs-1"> 
     @Html.TextBoxFor(x => x.Due.ToShortDateString()) 
    </div> 

trong viewmodel tôi

public class FormViewModel 
    { 
     public DateTime Due { get; set; } 


     public FormViewModel() 
     { 
      DueDate = DateTime.UtcNow;   
     } 
    } 

và tôi nhận được lỗi này

Templates có thể được sử dụng với lĩnh vực truy cập, bất động sản truy cập, chỉ mục mảng một chiều hoặc singl chỉ mục tùy chỉnh tham số e2 tham số . Mô tả: Một ngoại lệ không được giải quyết xảy ra trong khi thực hiện yêu cầu web hiện tại là . Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về số lỗi và địa chỉ có nguồn gốc từ mã.

Ngoại lệ chi tiết: System.InvalidOperationException: Templates có thể được sử dụng với lĩnh vực quyền truy cập, bất động sản, chỉ số mảng đơn chiều, hoặc đơn tham số tùy chỉnh indexer biểu thức.

Trả lời

51

nên được như thế này:

@Html.TextBoxFor(x => x.Due) 

Và nếu bạn muốn có một số định dạng cho ngày này:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
public DateTime Due { get; set; } 

và sau đó:

@Html.EditorFor(x => x.Due) 

của nếu bạn thực sự muốn để sử dụng phương thức .ToShortDateString() này, bạn cần sử dụng một công cụ không mạnh PED helper (rõ ràng đó là điều mà tôi muốn giới thiệu với):

@Html.TextBox("Due", Model.Due.ToShortDateString()) 
+1

@Darin Dimitrov - Ok tôi nghĩ rằng tôi đã sử dụng một ví dụ xấu trên đó vì ya nó được trả về một chuỗi anyways. Nói rằng nếu tôi muốn sử dụng "ToShortDateString()" tại sao tôi không thể sử dụng nó? – chobo2

+0

@ chobo2, bạn có thể chỉ định các định dạng bằng cách sử dụng thuộc tính 'DisplayFormat' và trình trợ giúp' Html.EditorFor'. –

+0

@Darin Dimitrov - vì vậy những gì tôi đang sử dụng được coi là một mẫu? Vì vậy, bất kỳ của những người giúp đỡ là mẫu và để thay đổi chúng tôi hoặc là phải chỉnh sửa chúng như Tomas Lycken nói hoặc sử dụng chú thích dữ liệu để làm việc? – chobo2

5

Bạn đang gặp lỗi vì .TextBoxFor() html helper đang sử dụng một built-in mẫu (một textbox để nhập chuỗi), và bạn đang đem lại cho nó là một biểu thức lambda quá phức tạp (ví dụ không thuộc về tập hợp các loại được liệt kê trong thư).

Để giải quyết sự cố, hãy thay đổi loại thuộc tính bạn muốn chỉnh sửa thành string, vì vậy MVC có thể sử dụng mẫu chuỗi mặc định hoặc để MVC sử dụng mẫu datetime mặc định thay thế. Tôi muốn khuyên sau:

@Html.TextBoxFor(m => m.Due) 

Nếu bạn không hài lòng với cách dùng của bạn đang yêu cầu chỉnh sửa một ngày, hãy đặt một cái nhìn cục bộ có tên là "DateTime.cshtml" trong ~/Views/Shared/EditorTemplates nơi bạn xây dựng trình soạn thảo để nó hoạt động theo cách bạn muốn.

+0

@ Tomas Lycken -Là cái mới này tôi không bao giờ nhớ nó có vấn đề trước khi tôi bắt đầu sử dụng dao cạo? Nếu tôi xây dựng của riêng tôi thì tất cả các ngày sẽ nhận được điều này? Ngay cả những người tôi sẽ không muốn? Ví dụ như nếu tôi muốn chỉ có một trong những ngày để có một ToShortDateString() nhưng tất cả những người khác để có chỉ render như một mặc định này có thể được thực hiện? – chobo2

+0

@ Tomas Lycken - vì vậy những gì tôi đã làm quá phức tạp? hiện nó không chuyển đổi nó thành một chuỗi đầu tiên sau đó đặt nó trong hộp văn bản? Tôi có thể đọc thêm về điều này (về những gì cho hộp văn bản có thể xử lý) nó chỉ có vẻ rất kỳ lạ – chobo2

+0

@ chobo2: Vấn đề không phải là nó là một điều rất phức tạp để * render * - nó chỉ là hook-up cho tên của thuộc tính ViewModel (sẽ được sử dụng cho thuộc tính 'name' của trường đầu vào) trở nên phức tạp hơn nhiều khi bạn cho phép các câu lệnh sâu hơn các câu lệnh được liệt kê trong thông báo lỗi của bạn. Nếu bạn muốn ảnh hưởng đến đầu ra của các ngày của bạn, hãy sử dụng thuộc tính '[DisplayFormat]' (hoặc một trong các thuộc tính khác có sẵn), hoặc tạo mẫu của riêng bạn. –

5

Nếu bạn đang sử dụng MVC và có một yếu tố mã nội tuyến, hãy thử đặt tham số như thế này -

@{ 
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString(); 

} 

@Html.DisplayFor(model => parameterValue) 
+0

Tôi không cần DateTime.Parse chỉ đơn giản là chuỗi datevalue = item.LastUpdate.ToShortDateString(); –

6

Có một tình trạng quá tải có thể giúp đạt được điều này, trong khi vẫn giữ nó mạnh mẽ gõ.

// Specify that you're providing the format argument (string) 
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString()) 

// Or use the overload with format and html options, where null is the htmloptions 
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null) 
0

Bạn đang gây hiểu lầm cho ứng dụng bằng cách chuyển phương thức trong tham số textboxfor thay vì chuyển biểu thức.

Bạn có:

@Html.TextBoxFor(x => x.Due.ToShortDateString()) 

Lưu trữ kết quả của bạn trong một biến và sau đó sử dụng một biểu thức. Hãy thử điều này

var shortDate = Model.Due.ToShortDateString(); 
@Html.TextBoxFor(x => shortDate) 
0

Thay vì thêm định dạng trong mô hình sử dụng @value chú thích như sau

@ Html.TextBoxFor (x => x.Due mới {@ Value = Model.Due.ToShortDateString()})

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