在ASP.NET MVC中建模最佳实践



我有两个问题与在mvc项目中管理模型的最佳方式有关。

  • 我可以使用构造函数来初始化我的模型(显然是用它的相关逻辑)吗
  • 为此,最好使用"构造函数方式",还是在创建新的模型实例后使用控制器调用的扩展方法

例如,我有一个联系人表单的模型。用户可以扮演三个角色:匿名者、客户或供应商,他可以在每个状态下提交表单。我唯一想要的是,如果用户登录(比如客户的角色或供应商的角色),我想在文本框中预加载他的数据。为了做到这一点,我写了这样的代码:

using System;
using System.Web;
using System.Web.Security;
using DrOkR2.Bll.Managers;
namespace DrOkR2.WebFront.Models
{
    public class RequestModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Prov { get; set; }
        public string Request { get; set; }
        public bool UsageConditions { get; set; }
        public RequestModel()
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated) return;
            if (HttpContext.Current.User.IsInRole("Client"))
            {
                var guid = (Guid)Membership.GetUser().ProviderUserKey;
                var manager = new ClientManager();
                var client = manager.GetClient(guid);
                client.Email = Membership.GetUser().Email;
                FirstName = client.FirstName;
                LastName = client.LastName;
                Email = client.Email;
                Phone = client.Phone;
                Prov = client.Prov;
            }
            else if (HttpContext.Current.User.IsInRole("Supplier"))
            {
                var guid = (Guid)Membership.GetUser().ProviderUserKey;
                var manager = new SupplierManager();
                var supplier = manager.GetSupplier(guid);
                supplier.Email = Membership.GetUser().Email;
                FirstName = supplier.FirstName;
                LastName = supplier.LastName;
                Email = supplier.Email;
                Phone = supplier.PrimaryPhone;
                Prov = supplier.BusinessProv;
            }
        }
    }
}

它非常有效,但我的问题是:我是否使用了最好的方式?

否,您的模型中不应该依赖HttpContext或任何数据访问。您将面临模型绑定的各种问题(更不用说紧密耦合了)。

在控制器或控制器使用的存储库中设置模型属性。

public ActionResult Contact(string id)
{
   var client = _repository.GetClient(id);
   var model = new RequestModel(){ /* set your properties from client */ };
   return View(model);
}

您的视图模型中有太多的业务逻辑,我不喜欢。您还将视图模型与HttpContext耦合,这不是一个好主意。

这种初始化属于控制器,例如

public class RequestModel
{
    public string FirstName { get; set; }
    ....
}
public ActionResult ContactForm(...)
{
    var contactModel = new RequestModel();  
    if (User.IsInRole("Client"))
    {
        ...
    } 
    else if (User.IsInRole("Supplier"))
    {
        ...
    }
    return View(contactModel);
}

我已经意识到了这一点。为了完成线程,我把它放在这里。有什么建议吗?型号:

public class RequestModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string Prov { get; set; }
    public string Request { get; set; }
    public bool UsageConditions { get; set; }
    public RequestModel(DrOkUser user )
    {
        if (user == null) return;
        var type = user.GetType().Name;         //Client o Supplier
        Email = user.Email;
        if (type == "Client")
        {
            FirstName = ((Client)user).FirstName;
            LastName = ((Client)user).LastName;
            Phone = ((Client)user).Phone;
            Prov = ((Client)user).Prov;
        }
        if (type == "Supplier")
        {
            FirstName = ((Supplier)user).FirstName;
            LastName = ((Supplier)user).LastName;
            Phone = ((Supplier)user).PrimaryPhone;
            Prov = ((Supplier)user).BusinessProv;
        }
    }
}

控制器方法:

public class HomeController : BaseController
{
 public ActionResult Assistance()
    {
        var user = GetCurrentUser();
        var mdl = new RequestModel(user);
        return View(mdl);
    }
}

和基本控制器:

public class BaseController : Controller
{
 public DrOkUser GetCurrentUser()
    {
        if (!HttpContext.User.Identity.IsAuthenticated) return null;
        DrOkUser user = null;
        var guid = (Guid)Membership.GetUser().ProviderUserKey;
        if (HttpContext.User.IsInRole("Client"))
             user = ClientManager.GetClient(guid);
        if (HttpContext.User.IsInRole("Supplier"))
            user = SupplierManager.GetSupplier(guid);
        user.Email = Membership.GetUser().Email;            
        return user;
    }

}

最新更新