我为未在模型中的规则验证的业务规则制定了验证方法,但我遇到了问题,无法使其正常工作。由于存在两种可能的情况(客户或卖家注册),因此需要在他们自己的视图和模型中单独处理它们。卖方注册继承了客户注册的基本信息,因此客户的所有字段也在卖方。但是由于我正在使用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个变量)?
答案 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)
您可能需要将RegisterViewModel
和RegisterSellerViewModel
中常见的方法提取到接口中,并在两个类中实现它。然后将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类型,则会导致运行时错误。