模型中的ASP.Net MVC HTTPRequestBase

本文关键字:MVC HTTPRequestBase Net ASP 模型 | 更新日期: 2023-09-27 18:28:01

我有几个实现接口的模型。我计算出,当它来自View时,我需要一个ModelBinder来在我的控制器类中处理它。

我现在想知道我应该在哪里设置我的模型的值。

我的BindModel方法目前看起来如下

public object BindModel(ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
{
    string type = controllerContext.HttpContext.Request.Form["ModelName"];
    if (type == null) 
    {
        throw new MissingFieldException("ModelName wasn't found");
    }
    type = type.Substring(type.LastIndexOf('.') + 1);
    HttpRequestBase request = controllerContext.HttpContext.Request;
    switch (type)
    {
        case "MissingDeliveryNoteNumberModel":
            MissingDeliveryNoteNumberModel mdnnModel = new MissingDeliveryNoteNumberModel(request);
            return mdnnModel;
        case "MissingCardBoxModel":
            MissingCardBoxModel mcbModel = new MissingCardBoxModel(request);
            return mcbModel;
        case "WrongItemsReceivedModel":
            WrongItemsReceivedModel wirModel = new WrongItemsReceivedModel(request);
            return wirModel;
        default:
            return null;
    }
}

WrongItemsReceivedModel看起来像这个

public WrongItemsReceivedModel(HttpRequestBase request) : this()
{
    if (request != null) 
    {
        ModelNumberID = request.Form["ModelNumberID"];
        OrderNumber = request.Form["OrderNumber"];
        String squant = request.Form["QuantityAndSize.Quantity"];
        String selectedItem = request.Form["QuantityAndSize.SelectedItem"];
        decimal quantity = 0;
        Decimal.TryParse(squant,out quantity);
        m_QuantityAndSize.Quantity = quantity;
        m_QuantityAndSize.SelectedItem = selectedItem;
    }
}

我的问题是:可以将初始化逻辑放在Model中吗?还是应该在我编写的ModelBinder中进行?两者都有效,但什么是最佳实践,为什么?

模型中的ASP.Net MVC HTTPRequestBase

最好像本文中那样在Binder中初始化模型。

其目的是将模型类与UI技术分离。HttpRequestBase是模型中应防止的依赖项。

例如,如果你想在不同的技术之间共享代码,并在移动应用程序或桌面应用程序中使用你的模型,你需要添加对System.Web的引用,这是不可接受的(或在某些平台中是不可能的)。

即使您不打算共享代码,您也可能希望在解决方案的不同项目中使用您的模型,并且每个项目都必须引用System.Web,这也不是一个好的方案,因为这些项目反过来可以引用到应用程序的非Web部分。