2010-02-11 21 views
6

Câu hỏi trong ngắn hạn:MVC.NET mili giây bị lạc khi sử dụng Html.hidden trên một cột DateTime LastUpdated cho phiên bản theo dõi

Làm thế nào tot làm this trong MVC.NET?

Câu hỏi trong phiên bản dài:

Im cố gắng sử dụng một cột DateTime trong một bảng SQL cho phiên bản theo dõi (điều này bản thân nó được đề xuất như một giải pháp để tái gắn một lớp dữ liệu Linq2Sql sau khi passedback bởi một editview cho bảng)

Nhưng bây giờ tôi nhận được 'hàng không tìm thấy hoặc thay đổi'-ngoại lệ. trên ctx.submit:

ctx.appointments.Attach(appointment,true); 
ctx.SubmitChanges(); 

nơi ctx là DataContext của tôi LINQ, các cuộc hẹn bàn của tôi, và bổ nhiệm các đối tượng hẹn tôi cố gắng để đính kèm .. Ive thiết lập bảng các cuộc hẹn như sugested here

Vấn đề này là cũng được ghi nhận bởi một độc giả của giải pháp được đề xuất. Ông đề xuất this làm giải pháp.

Vấn đề ở đây là không sử dụng biểu mẫu web, tôi sử dụng MVC.NET. Vì vậy, tôi đoán sử dụng

  <%= Html.Hidden("LastUpdate", Model.LastUpdate) %>     

làm cho tài sản LastUpdate thay đổi. Vì vậy, có một cách để đảm bảo tôi nhận được cùng một (hoặc ít nhất bằng) đối tượng DateTime khi điều này được chuyển trở lại vào hành động cập nhật của tôi?

Im sử dụng trình kích hoạt gettime() được đề xuất khi cập nhật bảng cuộc hẹn của tôi. điều này rõ ràng là lưu trữ một đối tượng datetime sql. có thể không được phân tích cú pháp bởi Linq2SQL. Tôi đoán điều này cũng thêm vào vấn đề.

Tôi hy vọng có giải pháp cho việc này. Tôi biết chỉ bằng cách sử dụng định dạng dấu thời gian sẽ giải quyết nó cũng .. nhưng đó là ngoài phạm vi của câu hỏi này

Trả lời

3

Tôi nghĩ rằng vấn đề là viết ra thời gian cập nhật cuối cùng vào một lĩnh vực ẩn như thế sẽ chỉ làm một ToString trên ngày theo mặc định sẽ không hiển thị ra mili giây. Bạn có thể thử render ra dấu thời gian như một số giá trị tuyệt đối như bọ ve:

<%= Html.Hidden("LastUpdate", Model.LastUpdate.Ticks) %> 

Sau đó bạn có thể tái tạo lại datetime của bạn ở phía bên kia bằng cách chuyển đổi các giá trị trở thành một lâu & xây dựng lại DateTime:

var dt = new DateTime(Int64.Parse(ticks)); 
+0

điều đó sẽ hoạt động có, cảm ơn u :) – ArjanW

4

bạn sẽ không belive tôi, nhưng cố gắng này: Trước khi sự trở lại trên bộ điều khiển của bạn, làm một

ModelState.Remove("LastUpdate"); 
return View(model); 

Lý do, một ai đó trong vô hạn sự tự tin de cide Html.Hidden sẽ giữ các giá trị "đã đăng" loại bỏ các sửa đổi. Ngay cả khi được tạo trên C# trên cùng một trang.

Cách đơn giản này bạn xóa nó khỏi ModelState để nó nắm bắt giá trị mới thay vì được đăng.

Một số người nói rằng hành vi mặc định của nó là đúng, nhưng xin vui lòng, tôi đang làm việc với một lưới điện làm bằng công cụ tìm kiếm tích hợp (công ty/sản phẩm) và trường ẩn cho khóa của sản phẩm (dài) . Thay đổi công ty được đăng trên cùng một trang.

<%= Html.Hidden("detalleProductos[" + i + "].PRO_PRODUCTOEMPRESAID", item.PRO_PRODUCTOEMPRESAID)%> 
<%= Html.Hidden("detalleProductos[" + i + "].DET_DETALLEENCUESTAID", item.DET_DETALLEENCUESTAID)%> 

Tôi đã dành rất nhiều giờ cố gắng tìm hiểu TẠI SAO nó cập nhật công ty sai (lần đầu tiên tôi tải). Bởi vì nó nhớ cái đầu tiên và loại bỏ sửa đổi tôi đã thực hiện trên C# trên cùng một trang. Khó nắm bắt.

Cuối cùng tôi đã phải làm điều này:

foreach (var s in ModelState.Keys.ToList()) 
       if (s.StartsWith("detalleProductos")) 
        ModelState.Remove(s); 

Tôi rất thất vọng, tôi quyết định gửi workaround của tôi ...

Chúc may mắn!

0

Bạn cần sử dụng thuộc tính DateTime.Ticks để nhận được mili giây.

Nếu bạn đang sử dụng ViewModel, bạn có thể xác định thuộc tính trên đó lưu trữ các dấu tick DateTime. Ví dụ:

public long LastUpdateTick { get; set; } 

Khi bạn ánh xạ thực thể với mô hình của mình và quay lại, bạn có thể thực hiện chuyển đổi giữa DateTime và dấu tick trong mã ánh xạ.

Chế độ xem của bạn sau đó có thể liên kết với thuộc tính LastUpdateTick. Điều này sẽ cho phép bạn vẫn sử dụng các biểu thức lambda cho ràng buộc nếu bạn muốn.

3

Nếu bạn không muốn sử dụng Ticks, TextBoxFor sẽ hoạt động nếu bạn chỉ định định dạng ngày và thuộc tính ẩn html.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" }) 
Các vấn đề liên quan