Scaffolded Web API Create Action参数是否为空?

时间:2016-07-10 19:37:09

标签: c# asp.net-mvc entity-framework scaffolding

在WebAPI MVC项目中,我有一个名为ServiceKey的EF对象。它只是几列。

VS支架/生成带视图的MVC 5控制器(使用EF)。它创造了我需要的所有方法。创建,编辑,删除等。要清楚,这是开箱即用的#34;控制器和视图。使用预生成的Create函数会生成null参数。这是它生成的代码:

    // POST: ServiceKeys/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Create([Bind(Include = "id,serviceKey,consumer,created,modified,deleted,deletedDate")] ServiceKey serviceKey)
    {
        if (ModelState.IsValid)
        {
            db.ServiceKeys.Add(serviceKey); //throws exception here
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        return View(serviceKey);
    }

serviceKey为空,因此EF会抛出错误,指出该实体不能为空:

Value cannot be null.
Parameter name: entity

可以肯定的是,这是我的路线:

Web API路线:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

RouteConfig:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

为什么这个开箱即用失败?

2 个答案:

答案 0 :(得分:0)

叹息

因为很明显,如果你的列名与表名相同,那么EF和MVC会混淆哪一个是哪一个。

在这个特定的例子中,表的名称与列相同,因为这是一个测试,当我扩展db上下文时,serviceKey guid是自动生成的,它没有被填写在表单中。

因此,它认为model.serviceKey列实际上是ServiceKey 对象,并且因为它是null,所以它变得很糟糕。

微软的快速拍手

答案 1 :(得分:0)

只需将 ServiceKey 实例名称从 serviceKey 更改为 seviceKeyObj 或其他内容,问题将得到解决。实例名应该与其类名不同。