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>
}
看起来您正在发送 PageID 的字符串值,您期望该值是 ObjectId 类型的对象。
模型绑定不知道如何获取此字符串并将其转换为 ObjectId。 如果你看一下MongoDriver中的ObjectId类,你会发现它非常毛茸茸的。
我们经常使用 mongodb,对于我们的 id,我们只是使用提供很大灵活性的字符串。 我不确定您需要 ObjectId 类作为文档 ID 的用例,但您可能不需要它。
因此,从这里开始,您似乎有两种选择。
- 将文档 ID 更改为字符串或其他内容
- 为 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; }
}