【问题标题】:Child Object returns Null after Ajax Post子对象在 Ajax 发布后返回 Null
【发布时间】:2017-04-09 17:44:39
【问题描述】:

我正在使用应该刷新部分视图的 Ajax 帖子提交一些信息。信息被发送到数据库,但是在返回部分视图时,Fees.Feetype 数据无法呈现,因为它为空。

在手动刷新时,Fees.FeeType 的渲染没有问题。

如何在 ajax 发布后将 FeeType 包含在部分视图中?

型号

    public class Members
    {
        public virtual ICollection<Fees> Fees { get; set; }
    }
    public class Fees
    {
            public int FeeTypesId { get; set; }
            public virtual FeeTypes FeeType { get; set; }
            public virtual Members Members { get; set; }
    }
    public class FeeTypes
    {
        public int Id { get; set; }
        public string FeeTypeName { get; set; }
    }

Ajax 帖子

            var token = $('[name=__RequestVerificationToken]').val();
            var postData = {
                __RequestVerificationToken: token,
                FeeOccurence: feeOccField.val(),
                FeeAmount: amountField.val(),
                FeeStatus: statusField.val(),
                FeeTypesId: typeField.val(),
                FeeDate: dateField.val(),
                MemberNo: memberNo
            };
            $.ajax({
                url: '/Members/AddFees',
                type: 'POST',
                data: postData,
                success: function (members) {
                    alert(result);
                    $("#details").html(members);
                },
                error: function (result) {
                    alert(result);
                },
                traditional: true

控制器

        public ActionResult AddFees (Fees fees)
        {
            if (ModelState.IsValid)
            {

                db.Fees.Add(fees);

                db.SaveChanges();

                Members members = new Members();
                members = db.Members.Find(fees.MemberNo);

                return PartialView("~/Views/Members/_MemberDetails.cshtml", members);
            }
        }

观看次数

@model AccPortal.Models.Members
    <div class="col-md-7 md-fees" id ="details">
        @Html.Partial("_MemberDetails", Model)
    </div>
    //This is the partial view.    
        @model AccPortal.Models.Members
            @foreach (var item in Model.Fees)
            {
//The error happens on this line but all other Fees properties are rendered without issue.
                <td class="md-fee-value"data-type="status">@item.FeeType.FeeTypeName</td>
            }

【问题讨论】:

  • 我能知道您是在局部视图中仅绑定 FeeType.FeeTypeName 还是所有数据?你在哪里 _MemberDetails.cshtml 部分视图?
  • 我只绑定在一个地方。 _MemberDetails.cshtml 在 ~/Views/Members/_MemberDetails.cshtml
  • 我的问题是你能发布你的部分视图代码_MemberDetails.cshtml
  • 我已经编辑了视图部分以显示哪个是局部视图
  • 检查我的波纹管代码,让我知道。

标签: c# .net ajax asp.net-mvc


【解决方案1】:

这些是您需要在代码中更改的内容,

首先,像这样从你的 Action 方法返回一个带有模型的局部视图,

return PartialView("_MemberDetails", members);

Datatype 应该是 ajax 方法中的 html。因此,在 ajax 方法中添加此波纹管。你可以在这行后面加上这行data: postData,

dataType: "html",

现在在你的ajax成功方法中,改成这样,

success: function (members) {
             //alert(result);  what is result here, that you have written
             $("#details").html(''); //first make it blank then render
             $("#details").html(members);
            },

在您的局部视图中,您需要在渲染值之前检查 FeeType 是否存在,

@model AccPortal.Models.Members
@foreach (var item in Model.Fees)
 {  
  if(item.FeeType != null)
   <td class="md-fee-value"data-type="status">@item.FeeType.FeeTypeName</td>
  else
   <td class="md-fee-value"data-type="status"></td> //You can write NA here
 }

【讨论】:

  • 我已经进行了更改,但问题仍然存在。
  • 完全相同的错误 "+ $exception {"对象引用未设置为对象的实例。"} System.NullReferenceException " 视图在错误发生的位置被注释@item.FeeType.FeeTypeName
  • 是的!您需要在渲染之前检查值 FeeType,检查我更新的答案并告诉我。
  • 我做不到。 FeeType 不是列表错误 CS0019 运算符“!=”不能应用于“方法组”和“int”类型的操作数
  • 为什么?发生什么事 ??什么问题?
【解决方案2】:

null 类型的问题最终是延迟加载。

在保存更改并包含 Fees.FeeTypes 以返回正确填充的模型后,我必须重新查询数据库。

        members = db.Members.Find(fees.MemberNo);
        members.Fees = db.Fees.Include(x => x.FeeType).Where(x => x.Members.MemberNo.Equals(x.MemberNo)).ToList();

【讨论】:

    【解决方案3】:

    您需要在填充列表之前检查null 值以避免null exception

     @model AccPortal.Models.Members
                @foreach (var item in Model.Fees)
                {
                  if(item.FeeType != null)
                    <td class="md-fee-value"data-type="status">@item.FeeType.FeeTypeName</td>
                }
    

    因为某些数据可能会丢失而导致问题,因此在if 条件下,它将仅填充not null 的数据

    【讨论】:

    • 这行得通。现在我必须找出为什么第一条记录为空。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2018-07-14
    • 2013-07-31
    • 1970-01-01
    • 2017-08-17
    • 2020-01-14
    • 2017-06-22
    相关资源
    最近更新 更多