0

私はAsp.net MVCでまったく新しいです

フォームに入力してデータベースに投稿したいのですが、モデル Binder の検証が false です。私のモデルにある私のエラーは表示されません

短くできなかった問題が何であるかがわからないため、申し訳ありません:

ここに私のモデルがあります:

public class Request
{
    //pkey
    public virtual int Id { get; set; }
    //Fkey
    public virtual int TourId { get; set; }

    [Required]
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string FirstName { get; set; }


    [Required]
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string LastName { get; set; }

    [Required]
    [EmailAddress(ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "Email")]
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string Email { get; set; }

    [Required]
    public virtual string Phone { get; set; }

    [MaxLength(100000000, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string Comment { get; set; }


    public virtual bool FrequentTraveler { get; set; }

    [Required]
    [Range(1, 500000)]
    public virtual int TravelersCount { get; set; }


    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public virtual string Date { get; set; }


    public virtual bool ContactTimePreference { get; set; }

    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string Country { get; set; }


    public virtual bool Archived { get; set; }

そして、これは私のフォームです:

@using (Html.BeginForm("Create", "Request"))
{
  <div class="form-group">
   <input  type="hidden" name="TourId" value="4"/>
  </div>

 <div class="form-group">
 @Html.EditorFor(model => model.Request.FirstName, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Request.FirstName, "", new { @class = "text-danger" , placeholder = "FirstName" })

 </div>



<div class="form-group">
 @Html.EditorFor(model => model.Request.LastName, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Request.LastName, "", new { @class = "text-danger" })
</div>


<div class="form-group">                                       
@Html.EditorFor(model => model.Request.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Request.Email, "", new { @class = "text-danger" })
</div>

<div class="form-group">
 @Html.EditorFor(model => model.Request.Phone, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Request.Phone, "", new { @class = "text-danger" })
</div>


 <div class="form-group ft">
 @Html.EditorFor(model => model.Request.FrequentTraveler)
 @Html.ValidationMessageFor(model => model.Request.FrequentTraveler, "", new { @class = "text-danger" })
    </div>


<div class="form-group">
   <input type="hidden" name="TravelersCount" value="3" />
</div>

  <div class="form-group">
    <input type="hidden" name="TravelersCount" value="3" />
  </div>



}

省略形として null を許可するフォーム グループの一部を省略します。

そして、これはリクエストコントローラーでの私の作成アクションです:

 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "Id,TourId,FirstName,LastName,Email,Phone,Comment,FrequentTraveler,TravelersCount,Date,ContactTimePreference,Country,Archived")] Request request)
    {
        if (ModelState.IsValid)
        {
            db.Requests.Add(request);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View();
    }

誰かが私のリクエストオブジェクトを有効にするための問題を教えてくれたらありがたいです。たとえば、サーバーで必要なファーストネームにnullを入れたときにエラーをユーザーに送信する方法があれば教えてください。

4

2 に答える 2

2

ModelStateビューが POST メソッドで期待するモデルとは異なるモデルのフォーム コントロールを生成しているため、無効になります。例えば

@Html.EditorFor(model => model.Request.FirstName, ...)

発生しています

<input type="text" name="Request.FirstName" .... />

ただし、POST メソッドのモデルにはRequest名前付きのプロパティがありません。名前付きのモデルRequestは 1 つしかないFirstNameため、バインディングは失敗し、検証属性ModelStateのために無効です。[Required]

モデルにバインドするにはRequest、html を次のようにする必要があります。

<input type="text" name="FirstName" .... />

さらに、[Bind]属性には が含まれているため、値を正しくバインドすることもできません"Request"

属性を削除し[Bind](とにかくすべてをバインドしたいようです。これがデフォルトです)、ビューで宣言したモデルと一致するように POST メソッドのモデルを変更するか、のPrefixプロパティを使用しますBindAttribute

public ActionResult Create([Bind(Prefix= "Request")] Request model)

最後に、非表示の入力の html を手動で削除し、@Html.HiddenFor(m => m.Request.TourId)etc を使用して、name 属性が一貫し、正しくバインドされるようにします。

最後に、What is ViewModel in MVC?を読むことをお勧めします。. ビューでデータ モデルを使用する。特に、フォームを編集するのが適切でない場合。

補足: POST メソッドで次のクエリを使用して、検証エラーのあるモデルのプロパティを簡単に確認できます。

var errors = ModelState.Keys.Where(k => ModelState[k].Errors.Count > 0).Select(k => new
{
    propertyName = k,
    errorMessage = ModelState[k].Errors[0].ErrorMessage
});
于 2016-06-29T06:01:31.623 に答える
0

パラメータと同じ名前をモデル名として使用しないでください。戻るときにバインド プロセスが中断されます。から署名を変更してみてください

public ActionResult Create(Request request)

public ActionResult Create(Request req)

ModelState エラーを確認するには、次のコードを使用します。

foreach (ModelState modelState in ViewData.ModelState.Values)
{
 foreach (ModelError error in modelState.Errors)
 {
    var xx = error.ErrorMessage;
 }
}

var xx にブレークポイントを設定すると、エラーの内容が表示されますが、使用した名前のために適切なバインディングがないためだと確信しています (実際には、名前 Request を別のものに完全に変更しますが、それは単に自分)。

お役に立てれば。

于 2016-06-28T11:43:45.933 に答える