1

モデル内の自分のルールから検証されていないビジネス ルールの検証メソッドを作成しましたが、動作させるのに問題があります。2 つのシナリオ (顧客または販売者の登録) が考えられるため、それらは独自のビューとモデルで個別に処理する必要があります。販売者登録は、基本情報の顧客登録から継承されるため、顧客のすべてのフィールドは販売者にもあります。しかし、私は 2 つの異なるモデルで作業しているため、検証を行っているフィールドが両方とも同じであってもObject、同じ検証方法を使用する必要がありました。しかし、残念ながら私はそうするのに苦労しています。

[CustomHandleError]
private bool ValidateRegistrationForm (Object registerViewModelObject) {
    if (registerViewModelObject is RegisterViewModel)
    {
        RegisterViewModel registerViewModel = 
            (RegisterViewModel)registerViewModelObject;
    }
    else
    {
        RegisterSellerViewModel registerViewModel = 
            (RegisterSellerViewModel)registerViewModelObject;
    }

    if (ModelState.IsValid)
    {
        string [] names = registerViewModel.Name.Split (
            new string [] {" "}, StringSplitOptions.RemoveEmptyEntries);
        if (names.Length == 1)
            ModelState.AddModelError ("Name", "Fill your full name");

        if (CustomerUtilities.IsCpf (registerViewModel.Identity) == false)
            ModelState.AddModelError ("Identity", "Invalid CPF value");

        if (this.AuthenticatorService.IsExistentUser (registerViewModel.Email))
            ModelState.AddModelError ("Email", "Email already registered");
    }
}

ご覧のとおりif (ModelState.IsValid)、IntelliSense の後、現在のコンテキストで registerViewModel が見つかりません。その変数は上記の if AND else 内で定義されているため、定義されていないコードに到達する方法がないため、なぜこれが起こるのだろうか。

これに対する回避策はありますか (新しいメソッドを作成するか、2 つの変数を渡す以外に)?

4

5 に答える 5

2

if ブロックのスコープ外で宣言RegisterViewModelし、if ブロック内で割り当てます。

RegisterViewModel registerViewModel;
if (registerViewModelObject is RegisterViewMOdel)
{
     registerViewModel = // ...
}
else
{
     registerViewModel = // ...
}
于 2013-02-18T20:12:03.630 に答える
1

RegisterViewModelステートメントの外側を定義する必要がありますififそして、ステートメント内で割り当てを行います。

お気に入り;

RegisterViewModel registerViewModel;
if(...)
{
  //make your assigment here.
}
于 2013-02-18T20:13:25.597 に答える
1

2 つの個別の変数が必要な場合は、if ステートメントの外側で両方を宣言し、後で null をテストします。

RegisterViewModel registerViewModel;
RegisterSellerViewModel sellerModel; 

if (registerViewModelObject is RegisterViewModel)
{
    registerViewModel = (RegisterViewModel)registerViewModelObject;
}
else
{
    sellerViewModel = (RegisterSellerViewModel)registerViewModelObject;
}

ただし、Object の代わりに使用するインターフェイスを定義する方が適切です。

public interface IRegisterViewModel
{
    public string Name { get; set;}
    public ... Identity {get; set;}
    ...
}

public class RegisterViewModel : IRegisterViewModel
{
    ...
}

public class RegisterSellerViewModel : IRegisterViewModel
{
    ...
}

次に ValidateRegistrationForm(IRegisterViewModel registerViewModel) を使用すると、if ステートメントを完全に取り除くことができます。

于 2013-02-18T20:23:14.620 に答える
0

おそらく、共通のメソッドをインターフェイスに抽出し、両方のクラスに実装する必要がRegisterViewModelありRegisterSellerViewModelます。registerViewModelObject次に、実際の型に関係なく、このインターフェイスにキャストします。

于 2013-02-18T20:18:24.097 に答える
0

この問題は、関数のメイン スコープで単一の変数が定義されていないために発生します。コードを記述した方法で、異なるスコープ内にある 2 つの変数を定義します。

解決策をどのように進めるか:

私は基本クラスを作ります。

class RegisterModel
{
   public string Name;
   public IdentifyType Identify;
   public string Email;
}

そして、両方のクラスが基本クラスから継承できます。このような:

class RegisterViewModel
   : RegisterModel
{...}
class RegisterSellerViewModel
   : RegisterModel
{...}

これで、実際に関数内の Object 変数を一度に変換できます。このような:

private bool Validate(Object viewModel)
{
   var castViewModel = (RegisterModel)viewModel;
   if(ModelState.IsValid)
   {
      ...
   }
}

viewModel が RegisterModel 型でない場合、実行時エラーが発生することに注意してください。

于 2013-02-18T20:25:08.957 に答える