3

我正在尝试使用 ASP.NET MVC 4 和 MongoDB 创建一个基本的电影数据库。我的问题出在我的 MovieController 的 POST Update 方法中。

[HttpPost]
    public ActionResult Update(Movie movie)
    {
        if (ModelState.IsValid)
        {

            _movies.Edit(movie);

            return RedirectToAction("Index");
        }

        return View();
    }

ModelState 包含电影的 Id 字段(它是一个 ObjectId 对象)的错误并引发以下异常:

 {System.InvalidOperationException: The parameter conversion from type 'System.String' to type 'MongoDB.Bson.ObjectId' failed because no type converter can convert between these types

这是更新视图:

@model MVCMovie.Models.Movie

@{
    ViewBag.Title = "Update";
}

<h2>Update</h2>

@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.Id);
    @Html.EditorForModel()

    <p>
        <input type="submit" value="Update" />
    </p>
}

和模型中的电影类:

namespace MVCMovie.Models
{
    public class Movie
    {
        [BsonId]
        public ObjectId Id { get; set; }

        public string Title { get; set; }

        public DateTime ReleaseDate { get; set; }

        public string Genre { get; set; }

        public decimal Price { get; set; }

        [ScaffoldColumn(false)]
        public DateTime TimeAdded { get; set; }
    }
}

编辑:解决方案我将 [ScaffoldColumn(false)] 添加到 Id 中,以便浏览器不会尝试呈现它。但是我仍然需要实现 Mihai 提供的解决方案才能传递正确的 ID。

我假设问题是在视图中引起的,因为它试图发送一个字符串而不是一个 ObjectId 对象。但我不知道如何解决这个问题,有什么想法吗?

4

3 回答 3

9

对于其他正在寻找这个答案的人,从这篇文章中可以完美运行: http: //www.joe-stevens.com/2011/06/12/model-binding-mongodb-objectid-with-asp-net-mvc/

创建模型绑定器:

public class ObjectIdBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        return new ObjectId(result.AttemptedValue);
    }
}

然后在 app start 中注册:

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdBinder());
}
于 2012-11-10T20:40:01.787 回答
3

问题是 MVC 不知道如何将您的 Id 转换为 ObjectId 类型。它只将其视为字符串。

您必须为您的方法使用自定义活页夹。看看这个链接http://www.dotnetcurry.com/ShowArticle.aspx?ID=584

看看这个

public class MovieModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelBinder = new DefaultModelBinder();
        var movie = modelBinder.BindModel(controllerContext, bindingContext) as Movie;
        var id = controllerContext.HttpContext.Request.Form["Id"];
        if (movie != null)
        {
            movie.Id = new ObjectId(id);
            return movie ;
        }

        return null;
    }
}

并更改您的更新方法

public ActionResult Update([ModelBinder(typeof(MovieModelBinder))] Movie movie)
于 2012-11-09T11:28:08.493 回答
1

似乎您需要编写自己的自定义类型转换器。
查看此讨论: ObjectId 类型转换器

于 2012-11-09T11:32:55.117 回答