2015-01-15 76 views
0

我有以下类型的,我使用,以便扩展我们整个系统中使用其他类型的:我基本上是使用这种类型充当一个容器我的剃刀模型是对邮政

public class SystemUser : User 
    { 
     public int? RoleId 
     { 
      get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
      set { RoleId = value; } 
     } 

     public Role _Role 
     { 
      get { return (Role)RoleId; } 
      set { RoleId = (int)value; } 
     } 

     public SelectListItem[] RolesList { get; set; } 

     public bool IsA(params Role[] roles) 
     { 
      return new List<Role>(roles).Any(v => v.Equals(_Role)); 
     } 

     public bool IsNotA(params Role[] roles) 
     { 
      return !(new List<Role>(roles).Any(v => v.Equals(_Role))); 
     } 
    } 

来自我们数据库的数据并将它从控制器作为@model传递给我们的视图。该视图获取填充很好,但在使用@ Html.LabelFor()字段修改模型并将该数据传递给我们用于将更新的数据保存到数据库的控制器之后,该模型为null。如果我单步执行POST,则在我的SystemUser类中的ROleId的getter上得到一个NullReferenceException异常。注意_Role属性;众所周知,如果某个类的属性与其类型具有相同的名称,则该模型将向控制器发布空白,但我已经修复了该类型。

这是视图的肉:

@model SystemUser 
@using (Html.BeginForm("Usr", "Mr", FormMethod.Post, new {@autocomplete="off"})) 
    { 
     //Fields removed for sake of simplifying stackoverflow post 

     <input class="button green-bg" type="submit" value="Save" /> 
     <input class="button gray-bg" type="button" onclick="location.href='@Url.Action("View", "Mr")'" value="Cancel" /> 
    } 

这里任何帮助将不胜感激。

+3

显示领域以及和控制器动作以及 – 2015-01-15 15:30:17

+0

只在助手(除显示器和标签)字段被绑定到模型中。确保你想要返回的字段在一个 – 2015-01-15 15:31:47

+0

你的控制器是什么样的?它是否有与[Usr]同名的方法,并且是用[HttpPost]属性装饰的方法?控制器是否真的命名为[Mr]? – ajawad987 2015-01-15 15:37:09

回答

3

当您在控制器中填充模型以创建视图时,您将获得一个EF模型(通过您的代码的外观),包括子关系

该视图将只回发与与页面中的命名输入元素匹配的属性。

由于Relationhip是服务器端收集,该属性将在null里面发布操作。后操作接收该类的简单版本(外键关系未填充)。

如果您需要它,请在控制器内部重新填充该属性(例如,根据发布的后端ID值)。

如果你显示你的控制器代码和基础User课呢,我可能能够提出具体的修改来解决这个:)

解决方法:

确保吸气性能测试如果集合是存在:

public int? RoleId 
    { 
     get { return this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
     set { RoleId = value; } 
    } 

附加:

我也有点担心,因为没有字段支持RoleId属性,所以set { RoleId = value; }实际上是一个递归调用。你可能想检查一下。

因为它是一个衍生的财产我本来期望它看起来像这样(没有setter):

public int? RoleId 
    { 
     get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
    } 

,或者如果它是充当数据库缓存的本地值,添加一个私有字段与属性:

private int? roleId; 
    public int? RoleId 
    { 
     get 
     { 
      return (roleId = roleId.GetValueOrDefault(this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id())); 
     } 
     set { roleId = value; } 
    } 
+0

啊。这很有道理。所以,我在我的POST方法的开头放置了一个断点,并且在它被击中之前,我得到了RoleId属性的getter上的NullReferenceException。我的问题是:甚至在进入POST方法之前试图访问此属性的是什么? – Killingsworth 2015-01-15 15:49:46

+0

automapper可能正在查看所有公共属性。通过简单阅读该属性,它会失败。现在我将为示例添加一个解决方法。 – 2015-01-15 15:51:25

+0

很酷。我一定会很感激! – Killingsworth 2015-01-15 15:53:29