2015-02-09 154 views
0

我正在建立一個博客網站。我希望用戶能夠編輯他們的帖子。 我需要更改HTML幫助程序的名稱以匹配我的模型,以便可以使用遠程驗證。覆蓋EditorFor ID和名稱

型號

 [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屬性需要是「URLString」,但是它會以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值字段中獲取模型數據。值= Model.post.URLString不起作用。

  • 如何重寫HTML name屬性@name = 「URLString」
  • 我很新的C#我可能失去了一些東西真的很明顯。

    回答

    0

    明白了。因爲我的表單元素的名稱保留了一個帖子。名稱之前我無法使用URLString。 我反而傳遞一個post對象並以這種方式獲取URL字符串。 我也通過ID進行更徹底的檢查。

    [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); 
        } 
    

    這是我的模型,傳遞一個額外的字段「ID」這也被放入我的發佈對象。

      [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>