2013-08-05 38 views
15

Tôi đang xây dựng ứng dụng MVC đầu tiên của tôi, tôi có một bảng trong cơ sở dữ liệu chứa 3 cột:Từ điển thông số chứa một mục null cho tham số 'id' kiểu nullable 'System.Int32'

    Id
  1. → tiểu học then chốt
  2. Tên đăng nhập
  3. mật khẩu

Khi tôi nhấp vào liên kết chỉnh sửa chỉnh sửa một kỷ lục, nó ném ngoại lệ sau đây:

Từ điển thông số chứa mục nhập rỗng cho tham số 'id' của loại không thể loại bỏ 'System.Int32' cho phương thức 'System.Web.Mvc.ActionResult Edit (Int32)' trong 'MvcApplication1.Controllers.UserController'. Tham số tùy chọn phải là loại tham chiếu, loại có thể không có giá trị hoặc được khai báo là tham số tùy chọn. tên Parameter: thông số

Đây là chỉnh sửa mã của tôi:

public ActionResult Edit(int id, User collection) 
{ 
    UserDBMLDataContext db = new UserDBMLDataContext(); 
    var q = from abc in db.User_Login_Details 
      where abc.Id == id 
      select abc; 

    IList lst = q.ToList(); 

    User_Login_Details userLook = (User_Login_Details)lst[0]; 

    userLook.Username = collection.UserName; 
    userLook.Password = collection.Password; 
    db.SubmitChanges(); 
    return RedirectToAction("Index");     
} 
+0

Nói chung, đây là về URL sai mà bạn đang xây dựng cho trang chỉnh sửa, chính xác hơn - về thông số id của URL. Kiểm tra trình duyệt của bạn, bạn nhận được URL nào khi bạn có loại ngoại lệ này và vui lòng đăng nó ở đây. – Dmytro

Trả lời

25

Bạn đang mong đợi một tham số id trong URL của bạn nhưng bạn không được cung cấp một. Chẳng hạn như:

http://yoursite.com/controller/edit/12 
            ^^ missing 
+2

Chỉ cần một FYI tôi biết nó không phải là trường hợp tương tự nhưng đã có lỗi tương tự như vậy, khi gửi một biến datetime, hãy chắc chắn để đặt nó trong một định dạng chính xác, nếu không BE (backend) sẽ không được công nhận lĩnh vực như một tham số hợp lệ và sẽ cung cấp cho bạn cùng một lỗi. (Tôi đã giải quyết nó gửi biến datetime dưới dạng một chuỗi và phân tích nó thành datetime trong BE) – Matias

+0

Bạn nói đúng. Tôi đang đối mặt với cùng một vấn đề khi chuyển loại dữ liệu nguyên thủy sang dịch vụ Đăng bài. nó phải có trong url là? id = 12 – Nepster

8

Lỗi này có nghĩa rằng khung MVC không thể tìm thấy một giá trị cho tài sản id của bạn mà bạn vượt qua như một cuộc tranh cãi với phương pháp Edit.

MVC tìm kiếm các giá trị này ở những nơi như dữ liệu tuyến đường, chuỗi truy vấn và giá trị biểu mẫu của bạn.

Ví dụ sau đây sẽ vượt qua id tài sản trong chuỗi truy vấn của bạn:

/Edit?id=1 

Một cách đẹp hơn sẽ được chỉnh sửa của bạn routing configuration để bạn có thể vượt qua giá trị này như một phần của URL thân:

/Edit/1 

Quá trình này nơi MVC tìm kiếm các giá trị cho tham số của bạn được gọi là Mô hình ràng buộc và đó là một trong những tính năng tốt nhất của MVC. Bạn có thể tìm thêm thông tin về Model Binding here.

2

Bạn nhận được lỗi đó vì ASP.NET MVC không thể tìm thấy giá trị tham số id để cung cấp cho tham số id của phương thức hành động của bạn.

Bạn cần phải chuyển giao đó như một phần của url, ("/ Home/Edit/123"), dưới dạng tham số chuỗi truy vấn ("/ Home/Edit? Id = 123") hoặc dưới dạng tham số POSTED (hãy đảm bảo có một cái gì đó như <input type="hidden" name="id" value="123" /> trong biểu mẫu HTML của bạn).

Hoặc, bạn có thể làm cho tham số id là một tham số rỗng (Edit(int? id, User collection) {...}), nhưng nếu id là null, bạn sẽ không biết phải chỉnh sửa gì.

+0

Đây là một chủ đề cũ nhưng tôi phải đối mặt với nó. là rất hữu ích @Rune. Cảm ơn – Alp

3

Phương thức hành động trên biểu mẫu của bạn có trỏ đến /controller/edit/1 không?

Hãy thử sử dụng một trong các:

// the null in the last position is the html attributes, which you usually won't use 
// on a form. These invocations are kinda ugly 
Html.BeginForm("Edit", "User", new { Id = Model.Id }, FormMethod.Post, null) 

Html.BeginForm(new { action="Edit", controller="User", id = Model.Id }) 

Hoặc bên trong hình thức của bạn thêm một "Id" lĩnh vực ẩn

@Html.HiddenFor(m => m.Id) 
+1

Nếu nó thực sự là @ Html.HiddenFor (m => m.Id)? Http: //stackoverflow.com/a/25188479/2200915 – Slicedbread

12

trong bạn WebApiConfig >>Register() Bạn cần phải thay đổi để

config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional } 

Ở đây, routeTemplate, được thêm vào với {action}

+0

Chỉ cần nhớ rằng thuộc tính "tên" cho tuyến đường mới của bạn phải là duy nhất. "DefaultApi" thường được xác định. – ComeIn

0

Chỉ trong trường hợp điều này sẽ giúp bất kỳ ai khác; lỗi này có thể xảy ra trong Visual Studio nếu bạn có dạng xem dưới dạng tab đang mở và tab đó phụ thuộc vào tham số.

Đóng chế độ xem hiện tại và khởi động ứng dụng của bạn và ứng dụng sẽ bắt đầu 'Thông thường'; nếu bạn mở một khung nhìn, Visual Studio sẽ giải thích điều này khi bạn muốn chạy chế độ xem hiện tại.

0

Chỉ cần thay đổi dòng code của bạn để

<a href="~/Required/[email protected]">Edit</a> 

từ nơi bạn đang gọi chức năng này sẽ vượt qua id corect

0

tôi đã có lỗi tương tự, nhưng đối với tôi, vấn đề là tôi đã thực hiện yêu cầu với GUID sai. Tôi đã bỏ lỡ 2 ký tự cuối cùng.

360476f3-a4c8-4e1c-96d7-3c451c6c86 
360476f3-a4c8-4e1c-96d7-3c451c6c865e 
Các vấn đề liên quan