MongoDB:MVC不会在发布时序列化BsonId

本文关键字:布时 序列化 BsonId MVC MongoDB | 更新日期: 2023-09-27 18:30:46

我无法使用MongoDB csharp官方库获取模型的ObjectId返回值。当我提交回控制器的表单时,PageID 始终{000000000000000000000000}模型中返回。 呈现的 HTML 具有有效的 id,即一个字段永远不会从表单帖子中正确返回。

html 呈现:<input id="PageID" name="PageID" type="hidden" value="4f83b5ccd79f660b881887a3" />

这就是我所拥有的。

型:

public class PageModel
    {
        public PageModel()
        {
            CanEdit = false;
            CancelRequest = false;
        }
        [BsonId]
        public ObjectId PageID { get; set; }
        [Display(Name = "Page URL")]
        public string PageURL { get; set; }
        [AllowHtml]
        [Display(Name = "Content")]
        public string Value { get; set; }
        [Display(Name = "Last Modified")]
        public DateTime LastModified { get; set; }
        [BsonIgnore]
        public bool CancelRequest { get; set; }
        [BsonIgnore]
        public bool CanEdit { get; set; }
    }

控制器柱:

[HttpPost]
        public ActionResult Edit(PageModel model)
        {
            // check to see if the user canceled
            if (model.CancelRequest)
            {
                return Redirect(model.PageURL);
            }
            // check for a script tag to prevent
            if (!model.Value.Contains("<script"))
            {
                // save to the database
                model.LastModified = DateTime.Now;
                collection.Save(model);
                // return to the page
                return Redirect(model.PageURL);
            }
            else
            {
                ModelState.AddModelError("Value", "Disclosures discovered a script in the html you submitted, please remove the script before saving.");
            }
            return View(model);
        }

视图:

@model LeulyHome.Models.PageModel
@{
    ViewBag.Title = "";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{ 
    <fieldset>
        <legend>Edit Page</legend>
        <div class="control-group">
            @Html.LabelFor(m => m.PageURL, new { @class = "control-label" })
            <div class="controls">
                @Html.TextBoxFor(m => m.PageURL, new { @class = "input-xlarge leu-required span9" })
                @Html.ValidationMessageFor(m => m.PageURL, null, new { @class = "help-block" })
            </div>
        </div>
        <div class="control-group">
            @Html.LabelFor(m => m.Value, new { @class = "control-label" })
            <div class="controls">
                @Html.TextAreaFor(m => m.Value)
                @Html.ValidationMessageFor(m => m.Value, null, new { @class = "help-block" })
            </div>
        </div>
        <div class="control-group">
            @Html.LabelFor(m => m.LastModified, new { @class = "control-label" })
            <div class="controls">
                @Html.DisplayFor(m => m.LastModified)
                @Html.HiddenFor(m => m.LastModified)
            </div>
        </div>
        @Html.HiddenFor(m => m.PageID)
        @Html.HiddenFor(m => m.CancelRequest)
        <div class="form-actions">
            <button type="submit" class="btn btn-primary">Save Page</button>
            <button type="button" class="btn btn-danger" id="cancelBtn">Cancel Changes</button>
        </div>
    </fieldset>
}
@section Footer {
    <script type="text/javascript" src="@Url.Content("~/Content/ckeditor/ckeditor.js")"></script>
    <script language="javascript" type="text/javascript">
        $(document).ready(function () {
            // adjust the editor's toolbar
            CKEDITOR.replace('Value', {
                toolbar: [["Bold", "Italic", "Underline", "-", "NumberedList", "BulletedList", "-", "Link", "Unlink"],
                  ["JustifyLeft", "JustifyCenter", "JustifyRight", "JustifyBlock"],
                  ["Cut", "Copy", "Paste", "PasteText", "PasteFromWord", "-", "Print", "SpellChecker", "Scayt"], ["Source", "About"]]
            });
            $("#cancelBtn").click(function () {
                $("#CancelRequest").val("True");
                $("#updateBtn").click();
            });
        });
    </script>
}

MongoDB:MVC不会在发布时序列化BsonId

看起来您正在发送 PageID 的字符串值,您期望该值是 ObjectId 类型的对象。

模型绑定不知道如何获取此字符串并将其转换为 ObjectId。 如果你看一下MongoDriver中的ObjectId类,你会发现它非常毛茸茸的。

我们经常使用 mongodb,对于我们的 id,我们只是使用提供很大灵活性的字符串。 我不确定您需要 ObjectId 类作为文档 ID 的用例,但您可能不需要它。

因此,从这里开始,您似乎有两种选择。

  1. 将文档 ID 更改为字符串或其他内容
  2. 为 ObjectId 类编写自定义模型绑定程序

希望对:)有所帮助

创建绑定:

public class ObjectIdBinder : IModelBinder{

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    return !string.IsNullOrWhiteSpace(result.AttemptedValue) ? ObjectId.Parse(result.AttemptedValue) : ObjectId.Empty;
}

}

创建模型绑定器配置:

命名空间 Nasa8x.CMS{ public class ModelBinderConfig { 公共静态空隙寄存器(ModelBinderDictionary binder) { 粘结 剂。Add(typeof(ObjectId), new ObjectIdBinder());

        binder.Add(typeof(string[]), new StringArrayBinder());
        binder.Add(typeof(int[]), new IntArrayBinder());
    }
}

}

在全球注册.cs:

 protected void Application_Start()
            {  
                ModelBinderConfig.Register(ModelBinders.Binders);
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);    
            }
如果不需要

C# 类中的 PageID 属性属于 ObjectId 类型,但希望在 MongoDB 端利用此类型,则可以让驱动程序在类定义中处理转换:

public class PageModel
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string PageID { get; set; }
}