ASP.NET MVC模型绑定

问题描述:

如果我有一个Controller Action,它可以从多个不同的源接收HTTP GET和HTTP POST,每个源发送不同的数据,例如ASP.NET MVC模型绑定

  1. Source1的执行与两个表单项项目1和项目2表单POST
  2. 源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

+0

++的想法是,显示页面和处理输入是非常明显的行动,不应该结合。 – 2010-03-23 21:45:36

+0

罗伯特感谢您的回复 我可能不清楚我的问题。 我希望有一个控制器动作能够接收HTTP GETS和POSTS,因为它们来自第三方。 另外,这些第三方将发送完全不同的数据,所以我不能按照您的建议(MyViewDataObject)对对象进行强类型绑定。这就是为什么我问是否可以绑定到字典。你知道这是可能的吗? – Noel 2010-03-23 22:02:28

+0

我不能想到*任何情况下,你会*在同一个方法中处理GET和POST。我的答案中有一个链接,显示如何绑定列表,但如果您要在控制器方法中接受简单的ole对象,则可能必须自己绑定它; MVC数据绑定器不会为您自动完成,除非您可以强制键入它。 – 2010-03-24 02:03:58