0

これは簡単なことのように思えますが、フレームワークではやりたいことをさせてくれないような気がします。

3 つのページがあるとします。1 つは名/姓を要求するページ、もう 1 つは電話番号を要求するページ、もう 1 つは両方を編集できるページです。

public class NameModel
{
public string FName {get;set;}
public string LName {get;set;}
}

public class PhoneModel 
{
public string Phone { get; set;}
}

public string NamePhoneModel
{
public string FName {get;set;}
public string LName {get;set;}
public string Phone {get;set;}
}

現時点でこれらのモデルを検証する方法は、2 つのインターフェイスがINameModelありIPhoneModel、すべての検証属性を持っていることです。私は何度も使用[MetadataType(typeof(INameModel))]します。NameModel[MetadataType(typeof(IPhoneModel))]PhoneModel

私が本当にやりたいことは、両方のインターフェースを使用することです。これにより、すべての検証属性NamePhoneModelを再入力する必要がなくなります。これは単純な解決策であることに注意してください。実際のプロジェクトはこれよりもはるかに複雑です。上記の例では、継承するのは簡単ですが、には存在しない追加のプロパティがある可能性があることを考えてください。または、さらに複雑にするために、別のページに存在する電子メールのプロパティが存在する可能性があります。NameModelNamePhoneModelNameModelEmailModel

これらすべてのルールを単純に複製しなければならないのは正しい方法ではないように感じます-より良い/適切な方法があるはずです??

4

2 に答える 2

1

モデルが使用する型として設定するか、再利用する汎用 ViewModel を作成して、適切なアクションで未使用のプロパティ検証エラーを破棄することができます。それらをタイプとして設定します:

public class Name
{
    public string First {get;set;}
    public string Last {get;set;}
}

public class Phone
{
    public string Number { get; set;}
}

public class NamePhoneModel
{
    public Name Name {get;set;}
    public Phone Phone {get;set;}
}
public class PhoneModel
{
    public Phone Phone {get;set;}
}
public class NameModel
{
    public Name Name {get;set;}
}

ジェネリック ビューモデル:

public class ViewModel
{
    public string First {get;set;}
    public string Last {get;set;}
    public string Phone {get;set;}

}

[HttpPost]
public ActionResult EditPhone(ViewModel model)
{
    ModelState["First"].Errors.Clear();
    ModelState["Last"].Errors.Clear();
    if (ModelState.IsValid)
    {
        // Validate Phone
    }
}

[HttpPost]
public ActionResult EditName(ViewModel model)
{
    ModelState["Phone"].Errors.Clear();
    if (ModelState.IsValid)
    {
        // Validate Names
    }
}

[HttpPost]
public ActionResult EditBoth(ViewModel model)
{
    if (ModelState.IsValid)
    {
        // Validate All
    }
}
于 2013-08-07T05:53:45.547 に答える