C# 模型中的可空列表
我在一个具有父子关系的模型中有一组多层对象。见下面的代码:C# 模型中的可空列表,c#,asp.net-mvc,model,C#,Asp.net Mvc,Model,我在一个具有父子关系的模型中有一组多层对象。见下面的代码: public class TracksCollectionsPagesModel : List<TracksModel> { } public class TracksModel : List<CollectionModel> { public Guid? TrackID { get; set; } public string TrackName { get; set; }
public class TracksCollectionsPagesModel : List<TracksModel>
{
}
public class TracksModel : List<CollectionModel>
{
public Guid? TrackID { get; set; }
public string TrackName { get; set; }
public string TrackDescription { get; set; }
//public List<CollectionModel> Collections { get; set; }
}
public class CollectionModel : List<PagesModel>
{
public Guid? CollectionID { get; set; }
public string CollectionName { get; set; }
public string CollectionDescription { get; set; }
//public List<PagesModel> Pages { get; set; }
}
public class PagesModel : List<ContentItemsModel>
{
public Guid? PageID { get; set; }
public string PageName { get; set; }
public string PageDescription { get; set; }
//public List<ContentItemsModel> ContentItems { get; set; }
}
public class ContentItemsModel
{
public Guid? ContentItemID { get; set; }
public string ContentItemName { get; set; }
public string ContentItemDescription { get; set; }
}
更新:应评论员请求添加了Javascript
// modal for adding Tracks
$('#AddNewTrack').click(function () {
$('#AddNewTrackModal').dialog({
autoOpen: true,
position: { my: "center", at: "top+350", of: window },
width: 500,
resizable: false,
title: 'Add Track Form',
modal: true,
open: function () {
$(this).load('@Url.Action("AddTrack")');
},
buttons: {
"Add Track": function () {
addTrackInfo();
},
Cancel: function () {
$(this).dialog("close");
}
}
});
});
function addTrackInfo() {
alert($("#AddTrackForm").serialize());
$.ajax({
url: '@Url.Action("AddTrack")',
type: 'POST',
data: $("#AddTrackForm").serialize(),
success: function (data) {
if (data.result) {
$(':input', '#AddTrackForm')
.not(':button, :submit, :reset, :hidden')
.val('')
.removeAttr('checked')
.removeAttr('selected');
alert(data.responseText);
$('#AddEntityModal').dialog("close");
window.location = "@Url.Action("Tracks")";
} else {
alert(data.responseText);
$('#AddEntityModal').dialog("close");
}
}
});
}
请注意,我已尝试从.not中删除hidden,但它仍然为空。如果您只是编辑TracksModel部分,那么您不需要担心视图中的任何集合,也就是说,您不需要创建表单字段,也不必担心将其发回 如果您要创建一个新的TracksModel,那么集合将为null,这一点非常好。如果您正在编辑一个现有的TracksModel,那么无论如何,您不应该直接保存回发,而是应该将已发布的数据映射回从数据库中重新提取的实体。例如:
var tracks = db.Tracks.Find(model.TrackId);
tracks.TrackName = model.TrackName;
tracks.TrackDescription = model.TrackDescription;
db.Entry(tracks).State = EntityState.Modified;
db.SaveChanges();
那么,无论集合是什么,都保持原样,没有任何更改。为什么您的类继承自基类,然后才将该基类的实例作为属性?我将其注释掉了,因为某些原因,在我最初进行模型设计时,它对我来说很有意义。我只是在创建新的轨迹,但是,tracksmodel在控制器中显示为空,因此我无法将其添加到数据库中。您是否通过AJAX发布?如果是这样的话,那么就包括你的AJAX代码,因为这似乎就是你的问题所在。另外,几乎这个精确的代码正在另一个模态窗口上使用,并且工作正常,这就是为什么我认为我可能需要将我的所有模型分离为单独的模型,而不是像我现在这样与基类进行菊花链接。我只是想在重新设计模型之前进行最后一次碰撞,看看是否可以了解导致此问题的原因。
// modal for adding Tracks
$('#AddNewTrack').click(function () {
$('#AddNewTrackModal').dialog({
autoOpen: true,
position: { my: "center", at: "top+350", of: window },
width: 500,
resizable: false,
title: 'Add Track Form',
modal: true,
open: function () {
$(this).load('@Url.Action("AddTrack")');
},
buttons: {
"Add Track": function () {
addTrackInfo();
},
Cancel: function () {
$(this).dialog("close");
}
}
});
});
function addTrackInfo() {
alert($("#AddTrackForm").serialize());
$.ajax({
url: '@Url.Action("AddTrack")',
type: 'POST',
data: $("#AddTrackForm").serialize(),
success: function (data) {
if (data.result) {
$(':input', '#AddTrackForm')
.not(':button, :submit, :reset, :hidden')
.val('')
.removeAttr('checked')
.removeAttr('selected');
alert(data.responseText);
$('#AddEntityModal').dialog("close");
window.location = "@Url.Action("Tracks")";
} else {
alert(data.responseText);
$('#AddEntityModal').dialog("close");
}
}
});
}
var tracks = db.Tracks.Find(model.TrackId);
tracks.TrackName = model.TrackName;
tracks.TrackDescription = model.TrackDescription;
db.Entry(tracks).State = EntityState.Modified;
db.SaveChanges();