Ich habe eine Datenbank mit Ordnern, in denen ich den gesamten Pfad zu einem Ordner als folder_name
speichern, also etw. wie: //MainFolder/subFolder/folderName
. In meiner Anwendung habe ich ein Modell namens Folder
, die die Ordner von db darstellt.Zugriff [NotMapped] -Eigenschaft mit einem benutzerdefinierten Getter/Setter
Modell:
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
wird nicht abgebildet, da sie nur ein Teil aus dem ganzen Weg ist, so will ich nicht zweimal speichern. Beispiel möchte ich meine:
Console.WriteLine(folder_name) output://MainFolder/subFolder/folderName
Console.WriteLine(folder_name_short) output:/folderName
Meiner Ansicht der Benutzer den Ordner umbenennen. So würde Ich mag die alten folder_name_short
auf den neuen ersetzen und speichern Sie den neuen String in folder_name
Ausblick:
.
.
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" />
}
.
.
Problem: Die Inputtextbox macht und zeigt den aktuellen Wert des folder_name_short
drin. Wenn ich es ändere und auf den Submit-Button klicke, erhalte ich eine System.NullReferenceException
im Model (wie im Quelltext markiert, bitte nach rechts scrollen). Ich verstehe nicht, was falsch ist und welche Änderungen nötig sind.
Edit:
wenn die Setter-Kommentar gesetzt wird, verschwinden die Ausnahme. Vielleicht verursacht der Setter den Fehler?
Lösung:
Verwendung der Standard-Setter und Getter zum Speichern des folder_name_short
Wert, sondern ein öffentliches get/set-Methode implementieren, um die folder_name
in der db zu setzen und diese Methode in der Steuerung aufrufen. Also:
[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);
}
Sind Sie sicher zu verstehen, dass Ordner-Objekt aus der Datenbank gefüllt wird und folder_name ist auch nicht null nach einreichen? – TSungur
Ja, der aktuelle Wert von folder_name_short ist in der imputbox sichtbar. –
Ich meine, wenn Sie die Seite übergeben, direkt bevor Sie in die Ausnahmelinie kommen (Sie könnten einen Haltepunkt in dieser Zeile setzen), schauen Sie sich die Eigenschaft folder_name an, ist sie in diesem Moment anders als null? – TSungur