1

これは私のasp.netmvc2プロジェクトのモデルです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.DynamicData;
using System.Web.Security;
using System.Globalization;
using System.Web.Profile;

namespace EMS.Models
{
public class UserModels
{

    [Required(ErrorMessage = "*")]
    public string userName { get; set; }

    [Required(ErrorMessage = "*")]
    public string passWord { get; set; }
  }
}

そしてこれは私の見解です:

 <% Html.EnableClientValidation(); %>
    <% using (Html.BeginForm()) { %>

    <table>
            <tr>
                <td><label for="userlogin">User Login:</label></td>
                <td>
                    <%: Html.TextBoxFor(m => m.userName, new { id = "userName"})%> 
                    <%: Html.ValidationMessageFor(m => m.name)%>
                </td>
                <td><label for="password">Password:</label></td>
                <td>
                    <%: Html.PasswordFor(m => m.passWord, new { id = "password"})%> 
                    <%: Html.ValidationMessageFor(m => m.passWord)%>
                </td>
             </tr>
            <tr>
                <td colspan="4">
                    &nbsp; <input type="submit"  name="enter_infor" id="enter_infor" value="Enter Information"/>
                </td>
            </tr>
    </table>

そしてこれは私のコントローラーです:

    [HttpPost]
    public ActionResult UserMaintenance(FormCollection frm)
    {
        UserModels candidate = new UserModels
        {
            userName = frm["userName"].ToString(),
            passWord = frm["passWord"].ToString()
       };

       DBSEntities context = new DBSEntities();
       UserName user = new UserName();
       context.AddToUserNames(user);
       context.SaveChanges();
       return View();
    }

問題:ユーザーがユーザー名とパスワードのテキストボックスの両方を入力したかどうかを検証したい。しかし、上記のすべてのコードで、ユーザーは検証メッセージなしでコードを送信できます。スクリプトをSite.Masterに含めました。誰でも教えてくれます、何が間違っていたのですか?

ありがとう。

4

2 に答える 2

2

1つは、POST中にモデルの状態をチェックしておらず、実際には強く型付けされたコントローラー/アクションとビューを使用する必要があるということです。ClientValidationが機能するようになった後でも、サーバー側のチェックを実行して、クライアントのものがバイパスされていないことを確認する必要があります。POSTメソッドを次のように変更できます

 [HttpPost]
        public ActionResult UserMaintenance(UserModels candidate)
        {
            //If the model is not valid, return the view with the posted values
            //Validation messages will appear where appropriate based on your 
            //View Model
            if(!modelState.isValid()){
               return View(candidate);
            }

            DBSEntities context = new DBSEntities();
            //Not sure what this code was doing, you were creating a variable
            //and then never setting the properties from the FormCollection on 
            //this new variable.  This seems to be the correct way below, but
            //whatever you need to do to get this POSTed info to your DB....
            context.AddToUserNames(candidate);
            context.SaveChanges();
            return View();
    }

ClientSideValidationに関する限り、適切なスクリプトが適切な順序で含まれていることを再確認してください(質問にそれらをリストできますか?)

于 2012-06-25T13:23:15.713 に答える
2

コントローラアクションで使用する必要がありますModelState.IsValid。そうしないと、設定したすべての検証が役に立たなくなります。

public ActionResult UserMaintenance(UserName user)
{
   if(ModelState.IsValid) // save the user only if it is valid
   {
       DBSEntities context = new DBSEntities();
       context.AddToUserNames(user);
       context.SaveChanges();
       return RedirectToAction("Index") // redirect to some other action or whatevery you wish
   }

   return View(); // else return the same view this will show all the validation errors
}
于 2012-06-25T14:33:34.393 に答える