2016-05-13 3 views
1

2つのテキストボックスを持つフォームがあります。ボックスにデータを入力するには、 データベースからデータを取得しています。私のユーザーがサブミットボタン をクリックして2つのテキストボックスの内容が変わらないときは、コード に行きたいです。送信ボタンをクリックしたときにフォームに変更があるかどうかを確認します。

ボックスの内容が変更された時期と変更されない時期はどのようにして判断できますか? 私は私が記憶しているものと何らかの比較をする必要がありますか?

 public ActionResult Edit(profile objprofiler) 
     { 
      if (ModelState.IsValid) 
      { 
       //Go fetch the existing profile from the database 
       var currentProfile = db.Profiles.FirstOrDefault(p => p.ProfileId == objprofiler.ProfileId); 
       //Update the database record with the values from your model 
       currentProfile.City = objprofiler.City; 
       currentProfile.State = objprofiler.State; 
       //Commit to the database! 
       db.SaveChanges(); 
       ViewBag.success = "Your changes have been saved"; 
       return View(profiler); 
      } 
     } 

答えて

1

単純なifの条件で値を比較することができます。このようなもの:

if ((currentProfile.City != objprofiler.City) || (currentProfile.State != objprofiler.State)) 
{ 
    currentProfile.City = objprofiler.City; 
    currentProfile.State = objprofiler.State; 

    db.SaveChanges(); 
} 

本当に達成しようとしているロジックを使用してください。各フィールドを個別に比較するかどうかは、||の代わりに&&などを使用します。実装する論理はあなた次第です。しかし、ifステートメントで比較を実行します。

==演算子の代わりにstring.Equals()演算子を使用して、文字列を大文字と小文字の区別オプションやその他の有用なオプションなどのいくつかのオプションと比較することもできます。


比較がより複雑になった場合、あなたはまたprofileオブジェクト自身でそれをカプセル化するかもしれません。おそらく.Equals()をオーバーライドすることによって、それは同等であるかどうかをテストするときには別の意味があります。たぶん、単純なヘルパー関数:

public bool IsEqualTo(profile obj) 
{ 
    return this.City == obj.City 
     && this.State == obj.State; 
} 

は、次に、あなたがちょうどそのメソッドを使用することができ、コントローラに:

if (!currentProfile.IsEqualTo(objprofiler)) 
    db.SaveChanges(); 
+0

私はフィールドが40のフォームがあるとどうなりますか?私は40のフィールドを比較しますか?これを行うにはよりよい解決策が必要です。あなたはそうは思わない? – user2320476

+0

@ user2320476:あなたはここで何を達成しようとしていますか? 40回の比較を行いたい場合は、40回の比較を行う必要があります。オブジェクト自体に比較をカプセル化することができます。そのため、コントローラではその機能を呼び出すコードが1行になります。 ( '.Equals()'をオーバーライドして、おそらく?)私は質問が本当になると思います...この余分なコードはすべて、データベースへの1回の旅行を節約する価値がありますか?その旅行をデータベースに保存することで、実際には何が達成されますか?パフォーマンスが*悪い*の場合、問題は別の場所にある可能性があります。 – David

+0

私が言っていることは、制限されたコードでフォームの変更を判断し、40個のフィールドをifステートメントと比較しない方法がなければならないということです。ありがとう。 – user2320476

0

私は一般的にこれを処理する方法には、任意の時間にデータを「汚い」フラグを設定することです変更イベントは、フォームのコントロールのいずれかで発生します。

ユーザーがフォームを送信すると、フラグの状態をチェックして、変更を保存する必要があるかどうかを確認するだけです。これにより、すべてのデータを以前の状態と比較する必要がなくなります。これは、フォームに多くの入力コントロールがある場合には迷惑になる可能性があります。例えば

bool isDirty; 

    private void textBox_TextChanged(object sender, EventArgs e) 
    { 
     // Possible validation here 
     SetDirty(true); 
    } 

    private void SetDirty(bool dirty) 
    { 
     // Possible global validation here 
     isDirty = dirty; 
    } 

    private void Submit() 
    { 
     if(isDirty) 
     { 
      // Save logic 
     } 
    } 

このアプローチは、任意のデータが変更されるたびに、あなたが任意のグローバル検証ロジックを実行することができます。

警告::ユーザーが変更を加えて元に戻すと、フォームは引き続きデータを送信します。

+0

'textBox_TextChanged'?これは私にとってMVCのようには見えません。確かにOPのもう一つの選択肢であるこの論理*クライアント側*を実行する可能性はあります。ユーザーがロジックをバイパスするかどうかは気にしない。 – David

+0

ええ、textBox_TextChangedはWindows開発の権利ですか?これは右のmvcではないですか? – user2320476

+0

謝罪、私は疑問を誤解しました。私はあなたがこれをほとんど無視することができると思います。 – Jack

0

クライアント側では、要素の値を初期値と比較するためにいくつかのjを実行することによって値が変更されたかどうかを確認できます。このようなもの。

function hasFormChanged() { 
    //textboxes, textareas 
    var els = document.querySelectorAll('input[type="text"], textarea, input[type="number"]'); 
    for (i = 0; i < els.length; i++) { 
     var el = els[i]; 
     if (el.value !== el.defaultValue) { 
      return true; 
     } 
    } 

    //checkboxes and radios 
    els = document.querySelectorAll('input[type="radio"], input[type="checkbox"]'); 
    for (i = 0; i < els.length; i++) { 
     var el = els[i]; 
     if (el.checked !== el.defaultChecked) { 
      return true; 
     } 
    } 

    //select 
    els = document.querySelectorAll('select'); 
    for (i = 0; i < els.length; i++) { 
     var el = els[i]; 
     if (el.options[el.selectedIndex].value != '') { 
      if (!el.options[el.selectedIndex].defaultSelected) { 
       return true; 
      } 
     } 
    } 

//if we get here then nothing must have changed 
return false; 
} 

とその機能は何かがあなたがtrueにこの

<input type="hidden" value="false" id="AnyUpdates" name="AnyUpdates"/> 

のような隠しフォームの値を設定することができます変更されたことを示すtrueを返します。

あなたのコントローラのアップデートでは、そのフィールドを読んで、あなたがあなたのDBを処理する必要があるかどうかを判断します。

関連する問題