我正在尝试使用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对象。但我无法弄清楚如何解决这个问题,任何想法?
答案 0 :(得分:9)
对于其他寻找此答案的人,请从这篇文章中完美地运作:http://www.joe-stevens.com/2011/06/12/model-binding-mongodb-objectid-with-asp-net-mvc/
创建一个Model Binder:
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());
}
答案 1 :(得分: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;
}
}
并按原样更改您的Update方法
public ActionResult Update([ModelBinder(typeof(MovieModelBinder))] Movie movie)
答案 2 :(得分:1)
似乎你需要编写自己的自定义类型转换器 看看这个讨论: ObjectId Type Converter