1

我无法使用 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>
}
4

3 回答 3

2

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

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

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

所以从这里看来你有两个选择。

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

希望有帮助:)

于 2012-04-11T05:53:32.067 回答
1

创建绑定:

公共类 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;
}

}

创建 ModelBinderConfig:

命名空间 Nasa8x.CMS { public class ModelBinderConfig { public static void Register(ModelBinderDictionary binder) { binder.Add(typeof(ObjectId), new ObjectIdBinder());

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

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

    }
}

}

在 Global.cs 上注册:

 protected void Application_Start()
            {  

                ModelBinderConfig.Register(ModelBinders.Binders);

                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);    

            }
于 2013-09-09T09:05:20.573 回答
1

如果您不需要 C# 类中的 PageID 属性为 ObjectId 类型,但想在 MongoDB 端利用此类型,则可以让驱动程序处理您的类定义中的转换:

public class PageModel
{

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

}
于 2016-05-11T11:32:00.970 回答