我的MVP模式项目中有用户注册功能,也是一个问题。
我可以在一些不同的地方进行用户注册,具体取决于它的位置,是否需要某些字段。
例如,如果用户在网上注册,则需要信用卡信息,但不需要注册管理区域。
我不知道该怎么做,如何强加这条规则。
谢谢!
答案 0 :(得分:1)
正如@Adam Rackis所说,你的问题有点模糊,但我会猜测你的意思。
如果您只是想从表单中删除某些字段,只需在视图中添加条件:
@if(!Model.inAdminArea)
{
<!-- put credit card field, etc here -->
}
根据您的模型的验证设置,您可能需要修改模型以为这些字段创建虚拟条目,这样您就不会收到验证错误。
但是,这似乎过于简单 - 在你的问题中添加一些细节。
答案 1 :(得分:0)
首先,我会在处理视图时推荐接口隔离原则: 公共接口IForm { event EventHandler提交; event EventHandler取消; }
public interface IFormData { TDto Item {get; set;} }
然后使用派生界面:
public interface MyFormInterface:IFormData,IForm {}
然后,演示者也可以仅基于场景并保持域不可知。 等...
希望这有帮助!
答案 2 :(得分:0)
听起来你需要拥有多个视图和演示者。视图可能遵循一些继承链以获得视图上的重用。
// Base requirements for user registration.
public interface IUserRegistrationView {
string FirstName { get; }
string LastName { get; }
string EmailAddress { get; }
string Password { get; }
}
public interface ISelfRegistrationView : IUserRegistrationView {
string CreditCardNumber { get; }
CardType CreditCardType { get; }
DateTime CreditCardExpirationDate { get; }
}
然后您将需要两位演示者。一个用于 Admin 注册,另一个用于自助注册。
只要您有某种支持性的商业服务来完成实际工作(创建用户) - 那么您可以做这样的事情......
public class AdminRegisterNewUserPresenter : BasePresenter
{
private readonly IUserRegistrationView view = null;
public AdminRegisterNewUserPresenter(IUserRegistrationView view) { this.view = view; }
public void RegisterNewUser()
{
try
{
UserBusinessService service = new UserBusinessService();
service.AdminRegisterNewUser(this.view.FirstName,
this.view.LastName, this.view.EmailAddress, this.view.Password);
}
catch(Exception e)
{
base.HandleError(e);
}
}
}
public class SelfRegistrationPresenter : BasePresenter
{
private readonly ISelfRegistrationView view = null;
public SelfRegistrationPresenter(ISelfRegistrationView view) { this.view = view; }
public void RegisterNewUser()
{
try
{
UserBusinessService service = new UserBusinessService();
service.NewUserSelfRegistration(this.view.FirstName,
this.view.LastName, this.view.EmailAddress, this.view.Password,
this.view.CreditCardNumber, this.view.CreditCardType, this.view.CreditCardExpirationDate);
}
catch(Exception e)
{
base.HandleError(e);
}
}
}