模型中的可空列表

时间:2014-10-20 14:47:04

标签: 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 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; }

}

我有一个局部视图,允许您创建“跟踪”最高级别对象的子集合列表,以及下面的子列表,直到您到达原始内容项目。但是,当我创建此局部视图并将数据提交到其中时,模型在控制器中始终显示为null。当我尝试提交具有不正确绑定的模型时,通常会发生这种情况。

@model JustLMS.Services.Models.Content.TracksModel



@using (Html.BeginForm("AddTrack", "Content", FormMethod.Post, new { @id="AddTrackForm"}))
{
<div id="showErrorMessage"></div>
Model.TrackID = Guid.NewGuid();
@Html.HiddenFor(m => m.TrackID)
<table>
<tr>
    <td>@Html.LabelFor(m => m.TrackName)    </td>
    <td>
        @Html.TextBoxFor(m => m.TrackName, new { @class = "k-textbox" })
        @Html.ValidationMessageFor(m => m.TrackName)
    </td>

</tr>
<tr>
    <td>@Html.LabelFor(m => m.TrackDescription)     </td>
    <td>
        @Html.TextBoxFor(m => m.TrackDescription, new { @class = "k-textbox" })
        @Html.ValidationMessageFor(m => m.TrackDescription)
</td>
</tr>

</table>


var collections = new List<JustLMS.Services.Models.Content.CollectionModel>();
Model.Collections = collections;
Model.Collections.Add(new JustLMS.Services.Models.Content.CollectionModel());


@Html.HiddenFor(m => m.Collections)





}

部分只需要发送有关轨道的数据,因为下面的任何内容都将在不同的屏幕上配置。我是否需要以某种方式初始化它下面的所有子类以使其成为有效的模型绑定?或者有一些我可以创建一个可空列表(抛出一个错误,说你不能在模型中有可空列表)。我应该创建一个单独的模型,只是为了添加这个部分的轨道?我应该将模型的所有这些级别分成不同的模型吗?只是试图弄清楚a)我如何才能使这个工作; b)做我想做的事情的最佳做法是什么?如果我没有足够清楚地解释,请随意提问。

更新

这是我的控制器代码,tracksmodel参数是以null为单位的内容

        [HttpPost]
    public JsonResult AddTrack(TracksModel model)
    {


        bool isSuccess;
        if (ModelState.IsValid)
        {
            isSuccess = _service.AddTrack((TracksModel)model);
            if (isSuccess == true)
            {
                return Json(new { result = isSuccess, responseText = "Track added!" });
            }
            else
            {
                return Json(new { result = isSuccess, responseText = "An error ocurred, please review your data for accuracy or contact your administrator.  " });
            }

        }
        else
        {
            isSuccess = false;
            return Json(new { result = isSuccess, responseText = "Unable to save track to database, please review your data for accurary." });
        }
    }

更新:在评论员请求中添加了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()中删除隐藏,但它仍为空。

1 个答案:

答案 0 :(得分:0)

如果您只是编辑TracksModel部分,那么您不必担心视图中的任何收藏品,即您没有&#39 ; t需要创建表单字段并担心将其发布回来。

如果您要创建新的TracksModel,那么Collections将为空,这一点完全没问题。如果您正在编辑现有的TracksModel,那么您无论如何都不应该直接保存回发,而是将发布的数据映射回从数据库中删除的新实体。例如:

var tracks = db.Tracks.Find(model.TrackId);
tracks.TrackName = model.TrackName;
tracks.TrackDescription = model.TrackDescription;
db.Entry(tracks).State = EntityState.Modified;
db.SaveChanges();

无论Collections是什么,然后保持原样,没有任何变化。