Razor代理类型错误。 System.Data.Entity.DynamicProxies

时间:2011-09-12 18:10:19

标签: asp.net-mvc-3 razor

我有一个类User,然后是另一个具有一些特殊用户属性的Type UserSpecial。 我将它在razor中传递给partial方法类以创建UserSpecial表单,该表单需要User Special类型的对象,但是我收到错误。

@model User
    @using (Html.BeginForm())
    { 

        @Html.ValidationSummary(true)
        <fieldset>
            @Html.Partial("../UserSpecial/_CreateOrEdit", Model.UserSpecial)
            <p class="submit clear">
                <input type="submit" value="Register" />
            </p>
        </fieldset>
    }
</div>

我得到错误 -

传递到字典中的模型项的类型为“System.Data.Entity.DynamicProxies.User_AC9DED50C9495788046D6BFA3B90DDFC6AD2884157CF23C91FCB3B7A55F70B18”,但此字典需要“UserSpecial”类型的模型项。

我在这里做错了什么?

从我的控制器中我只传递我在会话状态中存储的当前用户对象。

控制器 -

 public ActionResult Register()
        {
            return View(userRepository.Current);
        }

此处Current的类型为“User”

模型 -

public partial class User
    {
        public User()
        {
        }

        public int UserID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Sex { get; set; }
        public System.DateTime CreateDate { get; set; }
        public string Email { get; set; }
        public string HomeTown { get; set; }
        public short UserType { get; set; }

        public virtual UserSpecial UserSpecial { get; set; }
    }

_CreateOrEdit的模型声明是

@model UserSpecial

2 个答案:

答案 0 :(得分:4)

不知道userRepository.Current是什么,但似乎它没有正确/急切地加载UserSpecial属性。你为什么不使用视图模型?为什么要将域实体模型传递给您的视图?这是不好的做法。您应该定义视图模型,其中仅包含视图所需的数据,然后在您的域模型和将传递给视图的相应视图模型的控制器操作映射中。

答案 1 :(得分:0)

此问题的解决方案非常简单:

你应该像Darin建议的那样使用包装类(视图模型)。

例如:

(实体域模型):

public class MyEntityModel
{
    public int Id { get; set; }
    public String Name { get; set; }
}

=&GT;把它放在一个ViewModel(只是一个愚蠢的包装器)应该导致这个

public class MyViewModel
{
    public MyEntityModel MyEntityModel { get; set; }
}

现在,在视图中,您应该能够通过执行此操作来访问“name”属性

<div>
    The entity object's name is "@model.MyEntityModel.Name"
</div>

(注意你不应该使用@ model.Name!)