Trong ASP.NET MVC, các mô hình xem có nên có ID không?


11

Khi phát triển ứng dụng ASP.NET MVC cho phép mô hình được cập nhật, bạn cần một số cách để biết cách lấy mô hình khung nhìn được cập nhật và khớp nó lại với mô hình hiện được cập nhật. Dường như có một vài cách khác nhau để làm điều này và tôi tự hỏi liệu có bất kỳ cách nào trong số này không phải là MVC đúng không (giống như việc bộ điều khiển của bạn lưu trữ dữ liệu trong mô hình không phải là MVC phù hợp)?

Tất cả các kiểu xem đều có ID: Ưu điểm

  • Luôn đảm bảo bạn có thể phù hợp với mô hình của bạn.

Nhược điểm

  • Bạn phải thực sự cẩn thận rằng không có ID nào bị thay đổi nếu bạn có thể có người dùng cập nhật các hàng mà họ không nên truy cập.

Chỉ các mô hình chế độ xem tối thiểu mới có ID: Ưu điểm

  • Ít kiểm tra cần thiết hơn để tránh người dùng cập nhật dữ liệu họ không nên truy cập.

Nhược điểm

  • Khó khăn hơn nhiều để theo dõi mô hình xem phù hợp với mô hình nào.
  • Bạn vẫn phải kiểm tra một vài kiểu xem có ID để đảm bảo người dùng không cập nhật dữ liệu mà họ không nên truy cập.

Không có mô hình xem có ID:

Ưu

  • Không cần kiểm tra ID để cập nhật.

Nhược điểm

  • Bạn phải từ bỏ trạng thái không quốc tịch.

Vì vậy, tôi có hai câu hỏi.

Đầu tiên, có một lựa chọn đúng / không chính xác? (Nếu không, điều đó có nghĩa là sự lựa chọn là vấn đề quan điểm và ý kiến ​​câu hỏi thứ hai của tôi dựa trên và nên được bỏ qua.)

Thứ hai, nếu có một lựa chọn đúng / không chính xác, đó là gì?

Để làm rõ về một bình luận, tôi đang nói khi bạn có một mô hình khung nhìn giống với đối tượng cơ sở dữ liệu của bạn.

Nghĩ này:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

không phải cái này:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

2
Chính xác thì bạn sẽ làm gì với ID ViewModel? Không phải các đối tượng riêng lẻ trong ViewModel có ID riêng của họ chứ?
Robert Harvey

Tôi có lẽ chỉ nên chỉ định khi mô hình xem có liên quan đến một mô hình. Không phải tất cả các mô hình xem có liên quan.
Lawtonfogle

You have to abandon statelessness.- Bạn vừa đưa ra lựa chọn sử dụng MVC vô nghĩa.
Joel Etherton

ID mà bạn đang đề cập ở đây có phải là khóa chính của cơ sở dữ liệu hay thứ gì khác mà bạn đang thêm vào ViewModel không?
Vermis

@Vermis, tôi nghĩ rằng khóa chính của cơ sở dữ liệu sẽ là một ID đơn giản. ID kỹ lưỡng hơn sẽ là bất kỳ đoạn dữ liệu không thể sửa đổi nào cho phép bạn liên kết đối tượng đã chỉnh sửa của mình trở lại phiên bản tồn tại chưa được chỉnh sửa để có thể duy trì các thay đổi đã chỉnh sửa.
Lawtonfogle

Câu trả lời:


1

Nhìn chung, đối tượng ViewModel không phải là thứ được lưu trữ trong bảng cơ sở dữ liệu. Đó là các mục riêng lẻ trong đối tượng ViewModel được lưu trữ. Mỗi mục đó đã có ID.

Ví dụ:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

Vì không có bảng duy nhất trong cơ sở dữ liệu tương ứng với InvoiceViewModel, nên không có ID cho đối tượng InvoiceViewModel.

Tất nhiên, bạn luôn có thể sử dụng InvoiceID làm id cho ViewModel cụ thể này. InvoiceID là tiện dụng, vì đó là những gì đối tượng này cuối cùng đại diện. Nhưng tôi có thể thấy có một đối tượng ViewModel không tương ứng với bất kỳ ID cụ thể nào trong cơ sở dữ liệu.


1
Hãy suy nghĩ thay vì sử dụng các mô hình thực tế trong mô hình khung nhìn, InvoiceViewModel chỉ chứa các mô hình khung nhìn khác (liên quan đến các mô hình).
Lawtonfogle

-1

Theo mặc định, bạn nên có một id trong chế độ xem mặc dù bạn không sử dụng nó. Tạo một cột trong cơ sở dữ liệu có tên là idvà đánh dấu vào auto incrementtính năng này để bạn sẽ được sắp xếp.


1
Điều này trực tiếp mâu thuẫn với câu trả lời khác mặc dù, mà không đề cập lý do tại sao bạn nên có một id nào .
Martijn Pieters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.