Привязка модели ASP.NET MVC - PullRequest
       11

Привязка модели ASP.NET MVC

1 голос
/ 24 марта 2010

Если у меня есть действие контроллера, которое может получать HTTP GET и HTTP POST из нескольких разных источников, каждый из которых отправляет разные данные, например

  1. Source1 выполняет POST формы с двумя элементами формы Item1 и Item2
  2. Source2 выполняет GET, где данные содержатся в строке запроса (? ItemX = 2 & ItemY = 3)

Возможно ли иметь действие контроллера, которое будет обслуживать все эти случаи и выполнять привязку автоматически, например, публичный тест ActionResult (словарь данных) { // Работай ... возврат View (); }

Возможно ли это с помощью пользовательского связующего или каким-либо другим способом? Не хочу работать напрямую с HttpContext.Request, если возможно

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Обычно используется два метода контроллера: один метод контроллера обрабатывает GET, другой метод контроллера обрабатывает POST:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MyControllerMethod(string itemX, string itemY)
{
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyControllerMethod(MyViewDataObject data)
{
}

Если вам нужна помощь в связывании списков, сборников или словарей, вы можете найти ее здесь .

0 голосов
/ 26 марта 2010

Это решение работает, не лучше для модульного тестирования

     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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...