2016-03-21 3 views
0

私は、フォルダへのパス全体をfolder_name sthというフォルダに保存したデータベースを持っています。 //MainFolder/subFolder/folderNameのようになります。私のアプリケーションでは、dbというフォルダを表すFolderというモデルがあります。カスタムゲッター/セッターを使った[NotMapped]プロパティのアクセス

モデル:それは全体のパスからのみのサブストリングであるため、

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が表示されます(ソースコードにマークされていますので、右にスクロールしてください)。私は、何が間違っていて、何が変わるのかを理解していません。

編集:

セッターが例外が消え、コメントアウトされています。だから、設定者がエラーを引き起こしているのでしょうか?

ソリューション:

folder_name_short値を格納するための標準的なセッターとゲッターを使用していますが、DBにfolder_nameを設定し、コントローラでこのメソッドを呼び出すための公共のget/setメソッドを実装します。だから、:

[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); 
} 
+0

あなたはFolderオブジェクトをデータベースから移入されていることを確認されており、また、フォルダ名が後に提出nullでないを理解するために、このスレッドをrecommandでしょうか? – TSungur

+0

はい、folder_name_shortの現在の値はimputboxに表示されます。 –

+0

私はあなたが例外ラインに来る直前に(あなたはその行にブレークポイントを置くことができます)、ページを提出することを意味します。folder_nameプロパティを見てください。 – TSungur

答えて

1

フォーム上で編集された値は、短い名前folder_name_shortであれば、モデルクラスは、その文字列プロパティを含めることができます:

public string folder_name_short { get; set; } 

このプロパティには、任意のロジックが含まれていません。何らかのロジックを含む他のコードは、アクションメソッド内のコントローラに存在する可能性があります。

DBアクセスと、問題の原因となるMVCビューのモデルクラスとして同じクラスを使用しているようです。

+0

私はasp.netに相対的に新しいので、その質問のために私を許してください。しかし、「DBアクセスのための同じクラス」とMVCビューのモデルクラスとはどういう意味ですか?ここでこの単純なロジックを実装しないと、すべてのコントローラでそれを行う必要があります。私の編集 –

+0

クラス 'Folder'は' Key'属性で装飾されています。これはデータアクセス層でこのクラスを使用していると仮定し、Webアプリケーションのビューのクラスとしても使用しています。場合?エンティティのフォームとモデルのモデルは通常異なり、1つのuintedクラスにはデコレーション属性の異なるセット(データマッピングとフォームの検証)が混在したデータが含まれます。ビューモデルに別のクラスを持たせる方がクリーンです。繰り返すロジックは、ビジネスクラスまたはユーティリティ(ヘルパー)クラスに置くことができます。 –

+0

はい、そうです。私はこのクラスをビューとdatamappingに使用します。しかし、それは他のすべてのveiwsとコントローラのために働く。他のすべてのケースで 'folder_name_short'を得ることができますが、このビューでのみ私はそれを設定しようとし、** getter **でsetterではなくエラーを取得しようとします。なぜか分からない。私がセッターをコメントアウトする以外に、ゲッターは例外なく動作します –

0
[HttpPost] 
[("Rename")] 
public async Task<IHttpActionResult> ChangeFolderPath(Folder folder) 
{ 
    //Put a breakpoint here and make sure the folder has a value 
} 

おそらく、setterメソッドはfolder_nameの値を上書きします。

私は、カスタムのセッター C# properties: how to use custom set property without private field?

EDIT

public class Folder 
    { 
     [Key] 
     public string folder_name { get; set; } 

     /*Model Logic shouldn't be in the Poco*/ 
     /*You may put that in your model or best thing would be to implement a repository pattern*/ 
     public string ShortName() 
     { 
      string shortname = folder_name.Substring(folder_name.LastIndexOf("/"), folder_name.Length - folder_name.LastIndexOf("/")); //System.NullReferenceException here 
      return shortname; 
     } 
     public void SetUsingShortName(string value) 
     { 
      string shortname = folder_name.Substring(folder_name.LastIndexOf("/"), folder_name.Length - folder_name.LastIndexOf("/")); 
      this.folder_name = folder_name.Replace(shortname, value); 
     } 
    } 
+0

私はコントローラにこれを追加しますか?コントローラの名前変更アクションにも来ていません。モデルの例外は –

+0

の前にあります。folder_name_shortをプロパティの代わりにメソッドに置き換えることを検討してください。 投稿を更新しました – Alegrowin

+0

Poco(オブジェクト)にアクセスするためのロジックが必要なときは、モデルのような最上位レベルのエンティティにロジックを実装することをお勧めします。したがって、データを取得する設定のロジックから「データベースエンティティ」を分離し、それらのメソッドを後で別の場所に再利用することができます。 – Alegrowin

関連する問題