0

MVC 4 と Entity Framework を使用して Web アプリケーションを開発しています。作成/編集/削除する製品を表す ViewModel を使用しています。エントリをチェックし、必要に応じてエラー メッセージを表示する検証クラスを作成しました。

ViewModel を使用しているため、残念ながらエラー メッセージは表示されなくなりましたか? どのように進めればよいですか?

これが私の ViewModel です:

public class ProductViewModel
{

    public Product Product { get; set; }

    public ProductType ProductType { get; set; }

    public List<SelectListItem> ProductCompanies { get; set; }
}

これが私のアクションです(たとえば、作成します):

[HttpPost]
public ActionResult Create(ProductViewModel pvm)
{
    pvm.ProductCompanies = db.ProductCompanies.ToList().Select(s => new SelectListItem
    {
        Text = s.Name,
        Value = s.Id_ProductCompany.ToString()
    }).ToList();

    ViewBag.Id_ProductCompany = new SelectList(db.ProductCompanies, "Id_ProductCompany", "Name", pvm.ProductType.Id_ProductCompany);

    if (ModelState.IsValid)
    {

        ModelStateDictionary errors = Validator.isValid(pvm.ProductType);

        if (errors.Count > 0)
        {
            ModelState.Merge(errors);
            return View(pvm);
        }


        Product product = new Product
        {
            PurchaseDate = pvm.Product.PurchaseDate,
            SerialNumber = pvm.Product.SerialNumber,
            Id_ProductType = pvm.ProductType.Id_ProductType
        };

        ProductType productType = new ProductType
        {
            Model = pvm.ProductType.Model,
            CatalogPrice = pvm.ProductType.CatalogPrice,
            Id_ProductCompany = pvm.ProductType.Id_ProductCompany
        };

        db.ProductTypes.AddObject(productType);
        db.Products.AddObject(product);
        db.SaveChanges();
        return RedirectToAction("Index", "Person");    
    }

    return View(pvm);
}

私自身のバリデータ:

public static ModelStateDictionary isValid(ProductType element)
{
    ModelStateDictionary errors = new ModelStateDictionary();

    if (!Regex.IsMatch(element.Model, @"^[a-zA-Z0-9\s][a-zA-Z-_0-9\s]+$"))
    {
        errors.AddModelError("Model", "Invalid name !");
    }

    return errors;
}

メッセージを表示する場所:

<div class="editor-label">
    Model : 
</div>
<div class="editor-field">
    @Html.TextBoxFor(model => model.ProductType.Model, new { maxlength = 50 })
    @Html.ValidationMessageFor(model => model.ProductType.Model)
</div>
4

1 に答える 1

2

多分それをに変更する

Maybe `errors.AddModelError("ProductType.Model", "Invalid name !");

あなたの問題を解決します。

ちなみに、最善の解決策は、DataAnnotations を使用して独自の を作成することValidationAttributeです。

public sealed class ValidNameAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        ....check regex here...
    }
}

Name次に、プロパティをValidName属性で装飾する必要があります。

編集:

IValidatableObjectビューモデルでインターフェイスを実装することもできます。ASP.NET MVC がそれを取得し、自動検証を行います。

public class MyViewModel: IValidatableObject
{   
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (regexFails)
        {
            results.Add(new ValidationResult("Please enter valid name."));
        }
    }
}
于 2013-04-18T12:29:05.687 に答える