当ModelState无效时,没有传递参数

时间:2012-03-11 14:58:17

标签: c# asp.net asp.net-mvc-3 razor

我很难理解当ModelState无效时会发生什么(EF4.1,数据库优先)。

以下代码显示了为项目创建任务。

每当模型有效时,一切正常,但是当模型无效时,我得到一个例外,没有参数传递给模型(但是路线是正确的,一切都应该没问题)。 我做错了什么?

 //
    // POST: /Task/Create
    [Authorize()]
    [HttpPost]
    public ActionResult Create(int projectId, CPIO_Tasks task)
    {
        ViewBag.projId = projectId;

        try
        {            
            task.t_p_id = projectId;
            if (ModelState.IsValid)
            {

                db.CPIO_Tasks.AddObject(task);
                db.SaveChanges();
                return RedirectToAction("Details", "Projects", new { id = task.t_p_id });
            }

        }
        catch (DataException ex)
        {
            ModelState.AddModelError("Nieudane dodanie:", ex.ToString());
        }
        return RedirectToAction("Create", "Task", new {id = projectId});
    }
  

参数字典包含非可空类型'System.Int32'的参数'projectId'的空条目,用于'CPIO_WebUI.Controllers.TaskController'中方法'System.Web.Mvc.ActionResult Create(Int32)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

重定向ID正确的路径:localhost:11314 / Task / Create / 2。

提前感谢您提供任何帮助

安娜

2 个答案:

答案 0 :(得分:1)

正如错误消息所示,为了不将projectId传递给您的方法,您需要使您的方法看起来像这样:

public ActionResult Create(int? projectId, CPIO_Tasks task)
{
    // .....
}

这样做是使用Nullable<int>来获取值类型的参数(不允许null)并使其成为允许null的引用类型。这样,您可以传递null值而不会遇到此异常。

答案 1 :(得分:1)

我怀疑模型错误实际上来自您的GET操作,而不是您的POST操作。通常,当您出现模型错误时,您不会重定向,只需返回模型错误完整的相同视图,然后根据需要重新生成模型。在没有看到你的GET动作的情况下,很难说,但是尝试用适当的模型替换最终的重定向,并查看它是否对你不起作用。