1

これが更新されないのにエラーがスローされない理由はありますか?

public ActionResult Edit(int id, [Bind(Exclude = "deptid")]FormCollection collection)
    {
        var department = _repository.ListOne(id); //Grabs record from linq to sql
        try
        {
            UpdateModel(department);
            _entities.SubmitChanges();

            // TODO: Add update logic here

            return RedirectToAction("Index");
        }
        catch
        {
            return View(department);
        }
    }
4

2 に答える 2

5

場合によっては、MVC アセンブリ内のどこかでエラーがスローされ、適切に処理されず、モデルの状態に期待どおりにコピーされないことがあります。次に、ビューに を表示しようとするとHtml.ValidationSummary、エラーが表示されず、非常に混乱する可能性があります。ここに書いたこのモデル バインディング プロセスをクラッシュさせる可能性のある例の 1 つです。通常、これが起こっている理由を理解したら、コードを修正して、もう心配する必要はありません。

デバッグ中に検査するために使用する次のコードがあり、ブレークポイントでカーソルを合わせて、実際に何が起こっているかを確認できます。

public static IDictionary<string, string> GetModelStateErrors(this ViewDataDictionary viewDataDictionary)
{
    Dictionary<string, string> dict = new Dictionary<string, string>();
    foreach (var modelStateKey in viewDataDictionary.ModelState.Keys)
    {
        var modelStateValue = viewDataDictionary.ModelState[modelStateKey];
        foreach (var error in modelStateValue.Errors)
        {
            var errorMessage = error.ErrorMessage;
            var exception = error.Exception;
            if (!String.IsNullOrEmpty(errorMessage))
            {
                dict.Add(modelStateKey, "Egads! A Model Error Message! " + errorMessage);
            }
            if (exception != null)
            {
                dict.Add(modelStateKey, "Egads! A Model Error Exception! " + exception.ToString());
            }
        }
    }
    return dict;
}

次に、UpdateModel を試行した後にこれを挿入し、ブレークポイントを設定します。

var x = ViewData.GetModelStateErrors();

への呼び出しの直後にこれを置きますUpdateModel。にカーソルを合わせるxと、モデル バインディング プロセスで未処理の例外が表示されます。これが実際の問題である場合。

幸運を!

于 2009-09-22T21:31:37.723 に答える
1

モデル クラスにLinq to Sqlを使用しているときに、 Primary Keyを持たないテーブルに対して更新している場合、メソッドを呼び出しupdateModel()てもデータは更新されず、エラーも発生しません。このような場合の解決策は、DataContext クラスのオブジェクトでExecuteCommandorメソッドを使用することです。ExecuteQuery

元:

MyDataContext db= new MyDataContext();
string name="test";
int roll=123;

string UpdateStatement="Update table xyz set name='+ name+"' where roll="+ roll;
db.ExecuteCommand(UpdateStatement);
于 2011-03-21T08:38:55.010 に答える