0

私のアプリケーションでは、モデルのプロパティに注釈を追加すると、ModelState.IsValidがfalseになります。すべての注釈を削除すると、それが真になります。アノテーションを追加すると、アノテーションは機能しますが、フィールドが空であってもコードに反映されます。これは発生しないはずです。私はmvc4かみそりを使用しています。

注釈を適用したモデル

using System.ComponentModel.DataAnnotations;

namespace HRMDatabaseLayer.Entities
{
using System;
using System.Collections.Generic;

public partial class EmployeeDetail
{
    public EmployeeDetail()
    {
        this.EmployeeContactDetails = new HashSet<EmployeeContactDetail>();
        this.EmployeeDepartments = new HashSet<EmployeeDepartment>();
        this.EmployeeEducations = new HashSet<EmployeeEducation>();
        this.EmployeeExperiances = new HashSet<EmployeeExperiance>();
        this.EmployeeFamilies = new HashSet<EmployeeFamily>();
        this.EmployeeLanguages = new HashSet<EmployeeLanguage>();
        this.EmployeeSkills = new HashSet<EmployeeSkill>();
    }

    public int Id { get; set; }

    [Required(ErrorMessage = "First Name is Required")]
    public string FirstName { get; set; }
    public string MiddleName { get; set; }

    [Required(ErrorMessage = "Last Name is Required")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Employee Id is Required")]
    public string EmployeeId { get; set; }

    [Required(ErrorMessage = "Gender is Required")]
    public string Gender { get; set; }

    public string MaritalStatus { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Required(ErrorMessage = "Birth Date is Required")]
    public System.DateTime DateOfBirth { get; set; }

    public string IsAdmin { get; set; }
    public byte[] Picture { get; set; }

    [Required(ErrorMessage = "Password is Required")]
    public string Password { get; set; }

    public virtual ICollection<EmployeeContactDetail> EmployeeContactDetails { get; set; }
    public virtual ICollection<EmployeeDepartment> EmployeeDepartments { get; set; }
    public virtual ICollection<EmployeeEducation> EmployeeEducations { get; set; }
    public virtual ICollection<EmployeeExperiance> EmployeeExperiances { get; set; }
    public virtual ICollection<EmployeeFamily> EmployeeFamilies { get; set; }
    public virtual ICollection<EmployeeLanguage> EmployeeLanguages { get; set; }
    public virtual ICollection<EmployeeSkill> EmployeeSkills { get; set; }
}
}

これが私の見解です

<div>
@using (Html.BeginForm("Login", "Login"))
{
    <table>
        <tr>
            <td>
                <h3>Login</h3>
            </td>
        </tr>
        <tr>
            <td>Employee Id :
            </td>
            <td>
                @Html.EditorFor(model => @model.Employee.EmployeeId)
            </td>
            <td>
                @Html.ValidationMessageFor(model => @Model.Employee.EmployeeId)
            </td>
        </tr>
        <tr>
            <td>
                Password : 
            </td>
            <td>
                @Html.EditorFor(model => @Model.Employee.Password)
            </td>
            <td>
                @Html.ValidationMessageFor(model => @Model.Employee.Password)
            </td>
        </tr>
        <tr>
            <td>
            </td>
            <td>
                <input type="submit" value ="Login" />
            </td>
        </tr>
    </table>
    @Html.ValidationSummary(true)
}
<br />
</div>

これは、ModelState.IsValidを使用しているコントローラーコードです。

public ActionResult Login(LoginViewModel empDetails)
    {
        if (ModelState.IsValid)
        {
            if (ValidateUser(empDetails.Employee.EmployeeId, empDetails.Employee.Password))
            {
                Session["id"] = empRepository.GetEmpId(empDetails.Employee.EmployeeId);
                FormsAuthentication.SetAuthCookie(empDetails.Employee.EmployeeId, false);
                return RedirectToAction("Index", "User", new { area = "EmployeeDetails" });
            }
            else
            {
                ViewBag.LoginError = "The user name or password provided is incorrect.";
            }
        }
        empDetails.Employee.Password = string.Empty;
        return View("Index", empDetails);
    }
4

2 に答える 2

1

フィールド firstName、lastName などが必要ない場合は、ビューに送信されるモデルの一部であってはなりません。ドメイン モデルに注釈を付けてビューに送信する代わりに、そのビューに必要なプロパティのみを含むビュー モデルを作成し、そこにデータ注釈を配置する必要があります。

例: EmployeeDetail クラスからすべてのデータ注釈を削除してから、

public class LoginViewModel
{
    [Required(ErrorMessage = "Employee Id is Required")]
    public string EmployeeId { get; set; }
    [Required(ErrorMessage = "Password is Required")]
    public string Password { get; set; }
    //others you need for this view
}

ここで、ビューをこのモデルに強く型付けします。ModelState は、ビュー モデルで必要なプロパティのみを考慮し、ビューで不要なプロパティは考慮しなくなります。

「まだヒットしているコード」についてのコメントについては、おそらく追加する必要があります

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>

Web.Config に追加し、サーバー側とクライアント側の検証をより深く掘り下げるのに時間がかかる必要があります。

于 2013-02-01T13:21:08.253 に答える
1

必要なプロパティ Employee.FirstName、Employee.LastName、Employee.Gender、Employee.DateOfBirth のエディタまたは非表示フィールドがないようにしてください。したがって、このプロパティの検証は失敗します。

クライアントから EmployeeId と Password のみを取得する場合は、この 2 つのプロパティのみを含む別のモデルを使用する必要があります。

于 2013-02-01T12:16:06.500 に答える