从ActionLink接收方法的对象始终为null

时间:2016-01-14 09:08:29

标签: c# .net asp.net-mvc entity-framework actionlink

我环顾四周,发现有很多人遇到过这个问题。然而我的并不完全一样。虽然其他问题通常是通过使用ActionLink方法的正确重载来解决的,并且通过确保方法中的接收对象类型是正确的来修复,但不是这样。

在此示例代码中,根据所有其他源设置变量都是正确的,但是方法中收到的用户对象始终为null。

我做了什么:

  • 检查放入ActionLink的对象是否有数据(确实如此)
  • 检查我收到的物品类型是否正确,以及我发送的物品
  • 尝试使用Ajax ActionLink和HttpPost方法

这是代码首先来自后端然后是前端

public void DeleteUser(User user)
    {
        using (EFEntity context = new EFEntity())
        {
            context.User.Attach(user);
            context.User.Remove(user);
            context.SaveChanges();
            Response.Redirect("~/Home/someView");
        }
    }

行动链接前端:

foreach (User user in Model.userList)
{
    <tr>
        <td>
            @{
            number = number + 1;
            }
            @number
        </td>
        <td>@user.Gid</td>
        <td>@user.Name</td>
        <td>@user.Email</td>
        <td>@user.Permissions.Perm</td>
        <td>@user.LastUpdated</td>
        <td>
                @Html.ActionLink("Delete", "DeleteUser", "Service", user, new { @class = "btn btn-danger" })
        </td>
    </tr>
}

1 个答案:

答案 0 :(得分:0)

我认为问题出来了,有点奇怪,修复起来并不难。

检查用户对象&#39;更接近并查看浏览器中的源代码,您可以在对象上看到某种字符串,其中包含一堆数字以及&#34;动态代理&#34;。

通过进一步研究,我了解到对象始终为null的原因是因为对象是使用动态代理选项生成的。出于某种原因,这已经以某种方式启用了,只有这个特定的EF模型。

修复方法是在实体框架中全局禁用动态代理。

怎么做:

转到您的Model.edmx - &gt; Model.Context.tt - &gt; Model.Context.cs

她将要添加该行&#34; Configuration.ProxyCreationEnabled = false;&#34;在作为实体模型的公共方法中。

之前的代码:

public partial class EFEntity: DbContext
    {
        public EFEntity()
            : base("name=EFEntity")
        {
        }
        ......
    }

代码之后:

public partial class EFEntity: DbContext
        {
            public EFEntity()
                : base("name=EFEntity")
            {
                Configuration.ProxyCreationEnabled = false;
            }
            ......
        }

这应该全局禁用代理创建,并应修复此特定问题。

希望它可以帮助某些人,我已经很难找到错误的日子