1

我为未从模型中的规则验证的业务规则创建了一个验证方法,但我在使其工作时遇到了问题。由于存在两种可能的场景(客户或卖家注册),因此需要在各自的视图和模型中分别对待。卖家注册继承了客户注册的基本信息,因此客户中的所有字段也在卖家中。但是由于我正在使用 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 和 else 中定义的,所以如果没有定义它就无法访问该代码。

是否有任何解决方法(除了创建新方法或传递 2 个变量)?

4

5 回答 5

2

RegisterViewModel在 if 块范围之外声明,并在 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

如果您希望有两个单独的变量,则在 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

您可能需要提取接口中通用的方法RegisterViewModelRegisterSellerViewModel在两个类中实现它。然后registerViewModelObject不管它的实际类型如何转换到这个接口。

于 2013-02-18T20:18:24.097 回答
0

出现问题是因为您没有在函数的主范围中定义单个变量。在您编写代码的方式中,您定义了两个位于不同范围内的变量。

我将如何解决这个问题:

我会做一个基类。

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 回答