ASP.NET MVC模型绑定
问题描述:
如果我有一个Controller Action,它可以从多个不同的源接收HTTP GET和HTTP POST,每个源发送不同的数据,例如ASP.NET MVC模型绑定
- Source1的执行与两个表单项项目1和项目2表单POST
- 源2执行其中所述数据被包含在所述查询串中的GET(?ItemX = 2 & ItemY = 3)
有没有可能有一个控制器的行动,将迎合所有这些情况,并自动执行绑定例如 public ActionResult Test(Dictionary data) { //做功... return View(); }
这是可能的自定义活页夹或其他方式? 不希望如果可能的话
答
此解决方案,而不是最好的单元测试
public object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
TestIBE.Models.IBERequest _IBERequest;
HttpContextBase _httpContext;
Dictionary<string, string> _requestData;
_httpContext = controllerContext.HttpContext;
_requestData = this.CreateRequestData(_httpContext.Request);
_IBERequest = new TestIBE.Models.IBERequest(
_httpContext.Session.SessionID,
_httpContext.Request.UserHostAddress,
_httpContext.Request.UserAgent,
_httpContext.Request.Url,
_requestData);
return _IBERequest;
}
private Dictionary<string, string> CreateRequestData(
HttpRequestBase subject)
{
Dictionary<string, string> _result;
_result = new Dictionary<string, string>();
subject.Form.AllKeys.ForEach(key => _result.Add(key, subject.Form[key]));
subject.QueryString.AllKeys.ForEach(key => { if (!_result.ContainsKey(key)) { _result.Add(key, subject.QueryString[key]); } });
return _result;
}
public class IBEController : Controller
{
public ActionResult Landing(
[ModelBinder(typeof(TestIBE.Helpers.Binders.IBEModelBinder))] TestIBE.Models.IBERequest IBERequest)
{
// TODO
return View();
}
}
答
通常的模式是有两个控制器方法的一个控制器方法处理GET与HttpContext.Request直接工作,其他控制器方法处理POST:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MyControllerMethod(string itemX, string itemY)
{
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyControllerMethod(MyViewDataObject data)
{
}
如果您需要帮助绑定列表,集合或字典,你可以找到它here。
++的想法是,显示页面和处理输入是非常明显的行动,不应该结合。 – 2010-03-23 21:45:36
罗伯特感谢您的回复 我可能不清楚我的问题。 我希望有一个控制器动作能够接收HTTP GETS和POSTS,因为它们来自第三方。 另外,这些第三方将发送完全不同的数据,所以我不能按照您的建议(MyViewDataObject)对对象进行强类型绑定。这就是为什么我问是否可以绑定到字典。你知道这是可能的吗? – Noel 2010-03-23 22:02:28
我不能想到*任何情况下,你会*在同一个方法中处理GET和POST。我的答案中有一个链接,显示如何绑定列表,但如果您要在控制器方法中接受简单的ole对象,则可能必须自己绑定它; MVC数据绑定器不会为您自动完成,除非您可以强制键入它。 – 2010-03-24 02:03:58