ASP.NET MVC Updatemodel不更新但不抛出错误

时间:2009-09-22 16:58:58

标签: asp.net-mvc updatemodel

任何想法为什么这不会更新但不会引发错误?

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);
        }
    }

2 个答案:

答案 0 :(得分:5)

有时可能发生的事情是在MVC程序集内部某处抛出错误,该错误处理不当,并且不会按预期复制到模型状态。然后,当您尝试在视图中显示Html.ValidationSummary时,它不会显示错误,这可能非常令人困惑。我写过关于here的模型绑定过程可能崩溃的一个例子。通常,在您弄清楚为什么会发生这种情况之后,您可以对代码进行更正,而不再担心它。

我在调试期间使用以下代码进行检查,让我在断点处将鼠标悬停在它上面并查看实际情况:

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上会在模型绑定过程中显示任何未处理的异常,如果这就是问题所在。

祝你好运!

答案 1 :(得分:1)

对模型类使用 Linq to Sql 时,如果要针对没有主键的表进行更新,则调用updateModel()方法不会更新数据,也不会给出任何错误。 在这种情况下,解决方案是使用ExecuteCommandExecuteQuery方法与DataContext类的Object。

例如:

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

string UpdateStatement="Update table xyz set name='+ name+"' where roll="+ roll;
db.ExecuteCommand(UpdateStatement);