当前位置: 首页 > 知识库问答 >
问题:

ModelState。IsValid在使用MongoDB时包含错误

壤驷深
2023-03-14

我试图使用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对象。但是我不知道怎么解决这个问题,有什么想法吗?

共有3个答案

欧盛
2023-03-14

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

吕和风
2023-03-14

问题是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)
皇甫宇定
2023-03-14

对于其他任何想找到这个答案的人,从这篇文章中,它可以完美地工作: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大小必须