2009-09-27 26 views
8

Tôi đã tạo một bảng trong cơ sở dữ liệu có System.Guid làm khóa chính. Mô hình khung thực thể ADO.Net được yêu cầu đã được tạo và các thủ tục được lưu trữ cần thiết đã được ánh xạ.Sử dụng System.Guid làm khóa chính trong ASP.Net MVC?

Tôi đã tạo bộ điều khiển mới và thêm mã yêu cầu cơ bản cho Tạo và chỉnh sửa cho dữ liệu. Tuy nhiên khi nhấp vào liên kết để chỉnh sửa một kỷ lục đặc biệt là các lỗi sau đây được tạo:

The parameters dictionary contains a null entry for parameter '[MyId]' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Edit(System.Guid)' in '[MySite].[MyController].[SpecificController]'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters

Tóm lược sửa đổi hành động được khai báo trong bộ điều khiển như sau:

public ActionResult Edit(Guid itemId) 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(MyItem itemToModify) 
{ 

} 

Khi thêm mới ghi lại Guid mới được tạo ra thông qua một thủ tục lưu trữ và danh sách hiển thị đúng Guid. Url cũng chuyển đúng Guid để truy xuất.

Tôi dường như không thể nắm bắt được điểm mà tại đó điều này không thành công, nhưng làm thế nào tôi có thể đi qua một System.Guid như một tham số cho Controller?

Trả lời

17

Trừ khi bạn đã cập nhật tuyến đường của mình, nó được mong đợi (theo mặc định) thông số cuối cùng trong một tuyến đường được đặt tên là "id". Tức là, nếu bạn có một tuyến đường như/specific/edit/5646-0767 -..., nó sẽ ánh xạ guid vào từ điển giá trị tuyến đường bằng khóa "id" bất kể tham số nào trên phương thức của bạn được đặt tên. Tôi muốn tuân theo quy ước này và thay đổi định nghĩa phương pháp để:

public ActionResult Edit(Guid id) 

Bạn có thể làm được việc này, bằng cách xác định một cách rõ ràng tên của tham số tuyến đường, nhưng sau đó bạn kết thúc với một url trông giống như:/cụ thể/chỉnh sửa? itemid = 5646-0767 -...

+0

Bây giờ tôi cảm thấy ngu ngốc khi hỏi: ( – BinaryMisfit

+0

Đừng lo lắng về điều đó - lý do duy nhất tôi biết câu trả lời là tôi đã làm điều tương tự một lần và phải tính toán nó ra. – tvanfosson

4

đưa mẫu mã dưới đây cho bất cứ ai có thể cần nó (tôi chắc chắn đã làm)

 public ActionResult Profile(Guid? id) 
    { 
     if (!id.HasValue) 
     { 
      return View(new ProfileRepository().GetUserProfile(User.Identity.Name)); 
     } 

     return View(new ProfileRepository().GetUserProfile(id.Value)); 

    } 

Cảm ơn bạn đã anwer trên mà dẫn tôi ở bên phải hướng

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