0

我有一个带有 GUID 主键的表,我正在尝试使用 ASP.NET MVC 控制器的UpdateModel方法(db 是 LINQ-to-SQL 数据上下文)插入一个新创建的对象:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection collection)
    {
        Fields field = new Fields();
        field.ID = Guid.NewGuid();

        try
        {
            UpdateModel(field);

            db.Fields.InsertOnSubmit(field);
            db.SubmitChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View("Edit", field);
        }
    }

首先,模型上自动生成的 Edit 和 Create 视图包含一个供用户编辑的主键字段似乎很奇怪,但删除它们很容易。

但是我遇到了一个问题,UpdateModel当主键没有作为表单集合的一部分传入时,调用会引发异常。

我是否错过了将主键列标记为用户(以及对 的调用UpdateModel)不应该使用的东西的某种方式?我可以添加一个includeProperties数组并保留主键的名称,但这不是很干)。

我还可以在包含主键的表单中添加一个隐藏字段——使用 GUID 主键,我可以在创建的 GET 请求中执行此操作。

4

2 回答 2

3

不要UpdateModel在不更新模型对象时使用。在这种情况下,您正在创建一个...... ScottGu 在这篇博文中有一些很好的例子。

如果您想要一种更简单的数据绑定方式,如果您使用正确的命名约定,ASP.NET MVC 会自动为您完成很多工作。例如,具有输入字段“firstName”、“lastName”和“birthDate”的表单可以将其数据发送到具有以下签名的操作方法:

public ActionResult Create(string firstName, string lastName, DateTime birthDate)

并且参数将填充表单值。请注意,数据类型不必是字符串 - 事实上,您甚至可以绑定到自己的类。如果你有这门课...

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Birthdate { get; set; }
}

...以及带有输入字段“person_FirstName”、“person_LastName”和“person_BirthDate”的表单,您可以立即将其绑定到新的 Person 对象:

public ActionResult Create(Person person) { ... }

不错吧?=)

于 2009-09-23T23:52:59.100 回答
0

首先:在这种情况下,带有主键的属性应该是只读的。

您也可以使用自己的 BindModel 类。

于 2009-09-23T23:25:22.517 回答