【发布时间】:2016-03-21 12:18:04
【问题描述】:
我有一个包含文件夹的数据库,我将文件夹的整个路径存储为folder_name 等等。喜欢://MainFolder/subFolder/folderName。在我的应用程序中,我有一个名为 Folder 的模型,它代表 db 中的文件夹。
型号:
public class Folder
{
[Key]
public string folder_name { get; set; }
[NotMapped]
public string folder_name_short
{
get
{
string shortname = folder_name.Substring(folder_name.LastIndexOf("/"), folder_name.Length - folder_name.LastIndexOf("/")); //System.NullReferenceException here
return shortname;
}
set
{
string shortname = folder_name.Substring(folder_name.LastIndexOf("/"), folder_name.Length - folder_name.LastIndexOf("/"));
this.folder_name = folder_name.Replace(shortname, value);
}
}
}
folder_name_short 没有被映射,因为它只是整个路径的一个子字符串,所以我不想存储它两次。我的意思是示例:
Console.WriteLine(folder_name) output://MainFolder/subFolder/folderName
Console.WriteLine(folder_name_short) output:/folderName
在我的视图中,用户可以重命名文件夹。所以我想将旧的folder_name_short 替换为新的,并将新的字符串存储在folder_name
查看:
.
.
using (Html.BeginForm("Rename", "Folders", FormMethod.Post))
{
@Html.EditorFor(model => model.folder_name_short)
<input type="submit" value="rename folder" id="submit" class="btn btn-default" />
}
.
.
问题:
Inputtextbox 在其中呈现并显示folder_name_short 的当前值。当我更改它并单击提交按钮时,我在模型中得到一个System.NullReferenceException(如源代码中标记的,请向右滚动)。我不明白哪里出了问题以及需要进行哪些更改。
编辑:
当 setter 被注释掉时,异常消失。那么也许是 setter 导致了错误?
解决方案:
使用标准的setter和getter来存储folder_name_shortvalue,但是实现一个公共的get/set方法来设置db中的folder_name并在控制器中调用这个方法。所以:
[NotMapped]
public string folder_name_short { get; set; }
public string getfolder_name_short()
{
string shortname = folder_name.Substring(folder_name.LastIndexOf("/"), folder_name.Length - folder_name.LastIndexOf("/"));
return shortname;
}
public void setfolder_name_short(string newname)
{
string shortname = folder_name.Substring(folder_name.LastIndexOf("/"), folder_name.Length - folder_name.LastIndexOf("/"));
folder_name = folder_name.Replace(shortname, newname);
}
【问题讨论】:
-
您确定 Folder 对象是从数据库中填充的,并且在提交后 folder_name 不为空吗?
-
是的,folder_name_short 的当前值在输入框中可见。
-
我的意思是当你提交页面时,就在你来到异常行之前(你可以在该行放置一个断点),看看 folder_name 属性此时它不是 null 吗?
-
是的,此时
folder_name为空。这导致了我的问题,但我不明白为什么以及需要进行哪些更改。
标签: asp.net-mvc