ASP.Net 模型中的 MVC HTTPRequestBase
ASP.Net MVC HTTPRequestBase in Model
我有几个实现接口的模型。
我发现当来自视图时,我需要一个 ModelBinder 来在我的控制器 class 中处理它。
我现在想知道应该在哪里设置模型的值。
我的 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;
}
}
我的问题是:将初始化逻辑放在模型中是否可以,还是应该放在我编写的 ModelBinder 中?
两者都有效,但什么是最佳实践,为什么?
最好像 this article 一样在 Binder 中初始化模型。
目的是将您的模型 class 与 UI 技术分开。 HttpRequestBase 是模型中应避免的依赖项。
例如,如果您想在不同技术之间共享代码并在移动应用程序或桌面应用程序中使用您的模型,您将需要添加对 System.Web 的引用,这是不允许的(或在某些平台上不可能)。
即使您不打算共享代码,您也可能希望在解决方案的不同项目中使用您的模型,并且每个模型都必须引用 System.Web,这也不是很好的方案,因为这项目又可以引用到您应用的非网络部分。
我有几个实现接口的模型。 我发现当来自视图时,我需要一个 ModelBinder 来在我的控制器 class 中处理它。
我现在想知道应该在哪里设置模型的值。
我的 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;
}
}
我的问题是:将初始化逻辑放在模型中是否可以,还是应该放在我编写的 ModelBinder 中? 两者都有效,但什么是最佳实践,为什么?
最好像 this article 一样在 Binder 中初始化模型。
目的是将您的模型 class 与 UI 技术分开。 HttpRequestBase 是模型中应避免的依赖项。
例如,如果您想在不同技术之间共享代码并在移动应用程序或桌面应用程序中使用您的模型,您将需要添加对 System.Web 的引用,这是不允许的(或在某些平台上不可能)。
即使您不打算共享代码,您也可能希望在解决方案的不同项目中使用您的模型,并且每个模型都必须引用 System.Web,这也不是很好的方案,因为这项目又可以引用到您应用的非网络部分。