1

ページが「編集」モードで読み込まれると、テキストフィールドは正しくレンダリングされますが、フィールドの値が有効であっても、数値フィールドはエラー検証テキストが表示された状態でレンダリングされます。

数値フィールドにエラーテキストが読み込まれます

私の問題はより複雑なプロジェクトにありますが、これらのビットを追加しただけの、すぐに使用できるMVC3アプリケーションでそれを再現することができました。数値フィールドにエラーテキストが表示されるのに、ページが読み込まれるときにテキストフィールドに問題がないのはなぜですか?

ここで何が起こっているのですか?

モデル、コントローラー、ビューには次のものがあります。

モデル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace MvcIssues.Models
{
    public enum Operations
    {
        View = 0,
        Edit = 1
    }

    public class ShowsModel
    {
        public Operations Operation { get; set; }

        [Display(Name = "Name")]
        [DataType(DataType.Text)]
        [StringLength(10)]
        public string Name { get; set; }

        [Display(Name = "Number")]
        [Required]
        [Range(typeof(int), "1", "999")]
        public int Number { get; set; }
    }
}

コントローラ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcIssues.Models;
using MvcIssues.Data;

namespace MvcIssues.Controllers
{
    public class TestController : Controller
    {
        // GET: /Test/Shows
        [AcceptVerbs(HttpVerbs.Get)]
        [ActionName("Shows")]
        [Authorize]
        public ActionResult SelectedShows()
        {
            ShowsData shows = MvcApplication.Shows;

            ShowsModel model = new ShowsModel();

            model.Operation = Operations.View;
            model.Name = shows.Name;
            model.Number = shows.Number;

            return View(model);
        }


        // POST: /Test/Shows
        [AcceptVerbs(HttpVerbs.Post)]
        [ActionName("Shows")]
        [ValidateInput(false)]
        [Authorize]
        public ActionResult ShowsSubmit(ShowsModel data)
        {
            string name = data.Name;
            int number = data.Number;

            ShowsModel model = new ShowsModel();

            if (Request.Form.AllKeys.Contains("btnEdit"))
            {
                ShowsData shows = MvcApplication.Shows;
                model.Name = shows.Name;
                model.Number = shows.Number;

                model.Operation = Operations.Edit;
            }
            else if (Request.Form.AllKeys.Contains("btnCancel"))
            {
                ShowsData shows = MvcApplication.Shows;

                model.Name = shows.Name;
                model.Number = shows.Number;

                model.Operation = Operations.View;
            }
            else if (Request.Form.AllKeys.Contains("btnSaveEdit"))
            {
                ShowsData shows = MvcApplication.Shows;

                shows.Name = name;
                shows.Number = number;

                model.Name = shows.Name;
                model.Number = shows.Number;

                model.Operation = Operations.View;
            }

            return View("Shows", model);
        }
    }
}

意見:

@model MvcIssues.Models.ShowsModel

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<h2>Test Page</h2>

<div>
    Show = @this.ViewData.Model.Name
    <br />
    Number = @this.ViewData.Model.Number.ToString()
</div>

<hr />

<div>
    @Html.ValidationSummary(true, "oops!")

    @using (Html.BeginForm())
    {
        <div>

            Name: @(this.ViewData.Model.Operation == MvcIssues.Models.Operations.View ?
                Html.TextBoxFor(m => m.Name, new { disabled = "disabled", maxLength = "20" })
            :
                Html.TextBoxFor(m => m.Name))
            @Html.ValidationMessageFor(m => m.Name)

            <br />

            Number: @(this.ViewData.Model.Operation == MvcIssues.Models.Operations.View ?
                Html.TextBoxFor(m => m.Number, new { disabled = "disabled" })
            :
                Html.TextBoxFor(m => m.Number))
            @Html.ValidationMessageFor(m => m.Number)

        </div>

        <div>
            @switch (this.ViewData.Model.Operation)
            {
                case MvcIssues.Models.Operations.Edit:
                    <input type="submit" name="btnSaveEdit" value="Save" />
                    <input type="submit" name="btnCancel" value="Cancel" />
                    break;
                case MvcIssues.Models.Operations.View:
                default:
                    <input type="submit" name="btnEdit" value="Edit" />
                    break;
            }
        </div>        
    }

</div>

誰かが私を助けることができればそれは大いにありがたいです。

4

3 に答える 3

1

私も同じ問題を抱えていました。これが原因であり、私がそれを修正した方法は次のとおりです。

原因:

[Authorize]
[HttpGet]
public ActionResult BidToolv2(BidToolv2ViewModel model)
{
    ...

修正:

[Authorize]
[HttpGet]
public ActionResult BidToolv2()
{
    BidToolv2ViewModel model = new BidToolv2ViewModel();

基本的に問題は、ユーザーが最初にページにアクセスしたとき、コントローラーが空のモデルを取得し、ページが読み込まれたときに、モデルが既に渡されていると想定したことでした(おそらく?)。それについては完全にはわかりませんが、それを修正するために、パラメーターとしてモデルを削除し、代わりにコントローラーアクション自体でモデルを作成しました

お役に立てれば!

于 2014-05-07T21:24:16.257 に答える
0

さて、これをasp.netフォーラムに投稿しました。おそらく、同じ質問のもう少し簡潔な言葉で表現されたバージョンです。

解決策は少しハックでしたが、うまく機能しているようです-問題のあるビューモデルクラス用に空のコンストラクターを作成し、空のコンストラクター内でプロパティを有効な値に初期化しました。トリックをしました。

于 2012-07-12T19:45:38.963 に答える
0

何かが入力されていることを確認するために必須が必要です。

何かが入力されたときに値が要件を満たしていることを確認するには、範囲が必要です

    Example:



    [Required(ErrorMessage="Weekly Rental value is required")]
    [Range(1, 9999, ErrorMessage = "Value must be between 1 - 9,999")]
    public string WeeklyRental { get; set; }
于 2012-08-05T17:28:54.597 に答える