我试图使用ASP. NET MVC 4和MongoDB创建一个基本的电影数据库。我的问题是在我的电影控制器的POST更新方法。
[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; }
}
}
编辑:解决方案我将[脚手架列(假)]添加到id中,这样浏览器就不会试图呈现它。然而,我仍然需要实现Mihai提供的解决方案,以便通过正确的ID。
我假设这个问题是在视图中引起的,因为它试图发送一个字符串而不是ObjectId对象。但是我不知道怎么解决这个问题,有什么想法吗?
似乎您需要编写自己的自定义类型转换器
查看此讨论:ObjectId类型转换器
问题是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)
对于其他任何想找到这个答案的人,从这篇文章中,它可以完美地工作: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);
}
}
然后在应用程序启动中注册:
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdBinder());
}
描述 (Description) 它使用validate()方法检查模型状态,并检查每个属性的验证。 语法 (Syntax) model.isValid() 例子 (Example) <!DOCTYPE html> <head> <title> Model Example</title> <script src="https://code.jquery.com
这两个语法都是完全有效的,对于语法1,您可以像这里描述的那样更进一步,但是对于使用其中一个和另一个有什么性能/最佳实践建议吗?
原谅我的无知,这是我第一次尝试 ASP.Net 核心WebAPI。我正在使用阿斯普网核心.MVC 1.1.4,以防万一。我正在使用邮递员来测试我的API。 我有一个简单的HttpPost,它发回了预期的400个错误请求。对于这个测试,我发送了格式错误的XML,所以我的主机消息无法正确反序列化。客户希望以XML发送和接收的所有消息。 我期望获得状态为400的错误请求,并在模型状态中发现异常(反序列化
是否有一种方法可以检查堆栈中的前一个片段是否是包含SupportMap的片段?
当试图将Irrlicht静态库包含到我的cmake项目中时,您出现了一个编译错误 我不明白为什么它说它找不到,尽管我已经包含了X11库。
我正在使用HibernateValidator4.2。0.Final,我正在寻找在错误消息中包含类字段名的最简单方法。 我发现以下线程使用带有Hibernate验证器的定制ResourceBundle。根据这一点,我应该为每个约束注释创建自定义注释,为每个约束注释添加一个属性。 有没有更干净的方法来实现这一点? 以下代码: 生成默认错误:大小必须介于0和5之间。 我希望它是:myField大小必须