0

ブログサイトを作っています。ユーザーが自分の投稿を編集できるようにしたい。リモート検証を使用できるように、モデルに一致するように 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、ビューバッグを使用して、事前に入力されたデータを渡します。

<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 を使用し、name 属性を手動で変更して、リモート検証が機能するようになりました。

これは、Google Chrome でソースを表示したときにヘルパーが出力する生の 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>

それでうまくいきます!問題は、ビューバッグを使用してデータを事前設定できないことです。だから私は2つの問題を抱えていると思います.簡単なものを解決しましょう. 1. HTML 値フィールドでモデル データを取得するにはどうすればよいですか。値 = Model.post.URLString は機能しません。

  1. HTML 名属性 @name = "URLString" を上書きするにはどうすればよいですか

私はc#にかなり慣れていないので、ここで本当に明らかな何かが欠けているかもしれません。

4

1 に答える 1

0

とった。私のフォーム要素の名前には投稿があるためです。名前の前に URLString を使用できませんでした。代わりに、投稿オブジェクトを渡し、その方法で 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>
于 2015-02-10T12:32:37.883 に答える