根据类型转换对象

时间:2013-02-18 20:09:26

标签: c# asp.net-mvc model casting

我为未在模型中的规则验证的业务规则制定了验证方法,但我遇到了问题,无法使其正常工作。由于存在两种可能的情况(客户或卖家注册),因此需要在他们自己的视图和模型中单独处理它们。卖方注册继承了客户注册的基本信息,因此客户的所有字段也在卖方。但是由于我正在使用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)智能感知在当前上下文中找不到registerViewModel。我想知道为什么会发生这种情况,因为该变量是在上面的if和else中定义的,因此如果没有定义它,就无法达到该代码。

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

5 个答案:

答案 0 :(得分:2)

在if块范围之外声明RegisterViewModel,并在if块中指定它。

RegisterViewModel registerViewModel;
if (registerViewModelObject is RegisterViewMOdel)
{
     registerViewModel = // ...
}
else
{
     registerViewModel = // ...
}

答案 1 :(得分:1)

您应该在RegisterViewModel声明之外定义if。并在if声明中进行作业。

像;

RegisterViewModel registerViewModel;
if(...)
{
  //make your assigment here.
}

答案 2 :(得分: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语句。

答案 3 :(得分:0)

您可能需要将RegisterViewModelRegisterSellerViewModel中常见的方法提取到接口中,并在两个类中实现它。然后将registerViewModelObject转换为此接口,无论其实际类型如何。

答案 4 :(得分: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类型,则会导致运行时错误。