簡體   English   中英

asp.NET MVC 2 DataAnnotations UpdateModel <T> 驗證

[英]asp.NET MVC 2 DataAnnotations UpdateModel<T> validation

我正在嘗試使用DataAnnotations在asp.NET MVC 2 RC2中為我的模型添加驗證,使用TryUpdateModel

        var user = UserManager.Find(id);

        this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());

這會更新模型,但永遠不會調用驗證。 我也嘗試使用TryUpdateModel(這是用戶的直接類型),不使用表單值提供程序,直接使用ProvisioningObject(具有驗證元數據),無濟於事。

谷歌搜索示例僅為我提供了通過參數綁定來使用DataAnnotations的方法

public ActionResult Update(User user)

我不喜歡更新方案。

任何提示和/或解決方案?

編輯我的對象是來自WCF服務的自動生成的對象。

我做了部分能夠添加DataAnnotations。 我調用TryUpdateModel三次,因為它顯然不支持繼承,我認為這也是我對DataAnnotations的問題。 我為ProvisioningObject指定了驗證屬性,綁定不會查找類似的繼承內容。

[MetadataType(typeof(ProvisioningObjectMetadata))]
public partial class ProvisioningObject : IProvisioningObject
{
    public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } }
}


[MetadataType(typeof(UserMetadata))]
public partial class User : IUser
{
}


public class ProvisioningObjectMetadata
{
    [DisplayName("Country")]
    public string CountryIsoCode { get; set; }

    [Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")]
    [TempValidator]
    public string DisplayName { get; set; }
}


public class UserMetadata
{
    [DisplayName("Username")]
    public string Name { get; set; }
}


// Controller action
    public ActionResult Update(string id, FormCollection form)
    {
        var user = UserManager.Find(id);

        this.TryUpdateModel<IUser>(user.User, form.ToValueProvider());
        this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider());
        this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider());

        if (ModelState.IsValid) // always true
        {
            return Redirect;
        }
        else
        {
            return View();
        }
    }

如果我在UserMetadata中添加DisplayName的元數據,它會按預期工作,但這似乎沒有任何余地。 這意味着我還必須復制/粘貼所有繼承的接口,以便TryUpdateModel表現得恰當。

我想我正在尋找一種不需要我將驗證屬性復制並粘貼到繼承類的方法。

新答案:

“我的對象是來自WCF服務的自動生成的對象。”

自動生成的對象將不具有任何屬性。 您是在服務器端還是在客戶端定義對象及其屬性?

舊答案:如果您的元數據不在IProvisioningObject上,則不會調用任何驗證。 MVC2默認模型綁定器只知道如何查找“額外”[MetadataType(buddyClass)]驗證信息。

對於更新方案,綁定DTO,然后映射DTO,如果IsValid()到主模型類。

在部分類中實現IDataErrorInfo接口您必須為每個字段編寫自定義驗證(您可以使用數據注釋類來驗證每個必需的屬性)

如果您需要代碼示例,請告訴我。 我會為你寫的!

來源: http//www.asp.net/(S( pdfpdhu0ajmwt445fanvj2r3))/ learn /mvc/tutorial-37-cs.aspx

你怎么知道驗證沒有被調用? 您是否在更新控制器中檢查ModelState.IsValid並發現它錯誤地返回true?

典型的更新模式是:

UpdateModel(model);
if(!ModelState.IsValid) return View(model);
return RedirectToAction("Index");

如果您希望自動調用模型上的某些“IsValid”,則不會發生這種情況。 數據注釋使用Controller基類上的ModelState字典在幕后工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM