覆盖EditorFor ID和名称

时间:2015-02-09 10:16:37

标签: c# html editorfor remote-validation

我正在建立一个博客网站。我希望用户能够编辑他们的帖子。 我需要更改HTML帮助程序的名称以匹配我的模型,以便我可以使用远程验证。

模型

        [RegularExpression("[a-z]{1,50}", ErrorMessage = "URL String must be in lowercase")]
        [Required(ErrorMessage = "Unique URL is required")]
        [Remote("doesURLExist", "Post", HttpMethod = "POST", 
        ErrorMessage = "URL already exists. Please enter a different URL.")]
        public string URLString { get; set; }

HTML,使用viewbag传递我预先填充的数据。

<div class="form-group">
        @Html.LabelFor(model => model.post.URLString, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.post.URLString, new { htmlAttributes = new { @Value = ViewBag.postURL, @class = "form-control", @name = "URLString" } })
            @Html.ValidationMessageFor(model => model.post.URLString, "", new { @class = "text-danger" })
        </div>
</div>

预先填充的字段工作得很好,但我的远程验证不起作用。 name属性需要是&#34; URLString&#34;但它出现在post.URLString,它不能在我的远程方法中使用。

这是检查现有URLStrings的远程方法

    [HttpPost]
    public JsonResult doesURLExist(String URLString)
    {
        var allposts = _unitOfWork.PostRepository.Get();

        if (allposts.Count(p => p.URLString == URLString) == 0)
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }


        return Json(false, JsonRequestBehavior.AllowGet);
    }

我已经使用原始HTML进行远程验证并手动更改名称属性。

这是我在谷歌浏览器中查看源时助手输出的原始html。我复制了它并更改了名称。

<div class="form-group">
        <label class="control-label col-md-2" for="post_URLString">URLString</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" 
                   data-val-regex="URL String must be in lowercase" data-val-regex-pattern="[a-z]{1,50}" 
                   data-val-remote="URL already exists. Please enter a different URL." data-val-remote-additionalfields="" data-val-remote-type="POST" data-val-remote-url="/Post/doesURLExist" 
                   data-val-required="Unique URL is required" id="post_URLString" name="URLString" type="text" value=  />
            <span class="field-validation-valid text-danger" data-valmsg-for="URLString" data-valmsg-replace="true"></span>
        </div>
    </div>

这样效果很棒!问题是我无法使用我的viewbag预填充数据。 所以我想我有2个问题让我们解决更容易的问题。 1.如何在“HTML值”字段中获取模型数据。 value = Model.post.URLString不起作用。

  1. 如何覆盖HTML名称属性@name =&#34; URLString&#34;
  2. 我对c#很陌生。我可能会遗漏一些非常明显的东西。

1 个答案:

答案 0 :(得分:0)

知道了。因为我的表单元素的名称保留了一个帖子。在名称之前,我无法使用URLString。 我改为通过post对象并以这种方式获取URL String。 我还会通过身份证进行更彻底的检查。

[HttpPost]
    public JsonResult doesURLExist(tPost post)
    {
        var allposts = _unitOfWork.PostRepository.Get();

        if (allposts.Count(p => p.URLString == post.URLString) == 0)
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }

        if (allposts.Count(p => p.URLString == post.URLString && p.Id == post.Id) == 1)
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }

        return Json(false, JsonRequestBehavior.AllowGet);
    }

这是我的模型,传递了一个额外的字段&#34; Id&#34;这也被放入我的帖子对象。

            [RegularExpression("[a-z, 0-9]{1,50}", ErrorMessage = "URL String must be in lowercase")]
            [Required(ErrorMessage = "Unique URL is required")]
            [Remote("doesURLExist", "Post", AdditionalFields = "Id", HttpMethod = "POST", ErrorMessage = "URL already exists. Please enter a different URL.")]
            public string URLString { get; set; }

这是我的HTML,现在一切正常。

<div class="form-group">
            @Html.LabelFor(model => model.post.URLString, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.post.URLString, new { htmlAttributes = new {  @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.post.URLString, "", new { @class = "text-danger" })
            </div>
        </div>