5

私は次のモデルクラスを持っています:

public abstract class CompanyFormViewModelBase
{
    public CompanyFormViewModelBase()
    {
        Role = new CompanyRoleListViewModel();
        ContactPerson = new PersonListViewModel();
        Sector = new SectorListViewModel();
    }
    [Required]
    [Display(Name = "Company Name")]
    public string CompanyName { get; set; }
    public CompanyRoleListViewModel Role { get; set; }
    [Display(Name = "Contact Name")]
    public PersonListViewModel ContactPerson { get; set; }
    public SectorListViewModel Sector { get; set; }
}
public class AddCompanyViewModel : CompanyFormViewModelBase, IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        PlugandabandonEntities db = new PlugandabandonEntities();
        CompanyName = CompanyName.Trim();

        var results = new List<ValidationResult>();

        if (db.Company.Where(p => p.CompanyName.ToLower() == CompanyName.ToLower()).Count() > 0)
            results.Add(new ValidationResult("Company already exists.", new string[] { "CompanyName" }));
        return results;
    }
}

次のようなものを使用して「クラシック」で正常に動作します。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Plugandabandon.ViewModels.AddCompanyViewModel model)
    {
        if (ModelState.IsValid)
        {
            CreateCompany(model);
            return RedirectToAction("Index");
        }
        else
        {
            return View(model);
        }
    }

しかし、このモデル クラスを別の ajax フォームにも使用したいと考えています。私は次の方法を持っています:

   public JsonResult ReturnJsonAddingCompany(string companyName, int roleID, int sectorID, int personID)
    {
        Plugandabandon.ViewModels.AddCompanyViewModel model = new ViewModels.AddCompanyViewModel()
        {
            CompanyName = companyName,
            ContactPerson = new ViewModels.PersonListViewModel()
            {
                SelectedItem = personID
            },
            Role = new ViewModels.CompanyRoleListViewModel()
            {
                SelectedItem = roleID
            },
            Sector = new ViewModels.SectorListViewModel()
            {
                SelectedItem = sectorID
            }
        };

        ValidateModel(model);

        if (ModelState.IsValid)
        {
            CreateCompany(model);
        }
        else
        {
            throw new Exception("Company with such name already exists");
        }

        var list = Utils.CompanyList();
        return Json(list, JsonRequestBehavior.AllowGet);
    }

見る

    ValidateModel(model);

ライン。モデルが正しければ、問題なく動作します。正しくない場合 - 例外をスローし、メソッドの継続実行を中断します (そしてビューに例外を返します)。また、ブレークポイントを設定すると

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

メソッド、無効なモデルの場合に呼び出されることはありません! (有効なモデルで Validate メソッドが呼び出されます)。「クラシック」メソッドのような動作が必要で、モデルを検証してから ModelState.IsValid を検証します。ValidateModel(model) の動作は私にとって非常に奇妙で、「ブラック ボックス」です...

4

1 に答える 1

4

ValidateModel()モデルが有効でない場合、例外をスローします。代わりに、TryValidateModel()

ドキュメントから

TryValidateModel() は、モデルの検証が失敗した場合に TryValidateModel() メソッドが InvalidOperationException 例外をスローしないことを除いて、ValidateModel() メソッドに似ています。

于 2015-05-18T00:13:10.953 に答える