Как контроллер получает параметры по методам HttpPost? - PullRequest
7 голосов
/ 31 октября 2011

Возьмите этот фрагмент из контроллера, например:

public ActionResult Login()
{
    if (User.Identity.IsAuthenticated)
    {
        return RedirectToAction("Index", "Home");
    }
    else
    {
        return View();
    }
}

//
// POST: /User/Login

[HttpPost]
public ActionResult Login(LoginModel lm, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(lm.UserName, lm.Password))
        {
            FormsAuthentication.SetAuthCookie(lm.UserName, lm.RememberMe);
            if (Url.IsLocalUrl(returnUrl) &&
                returnUrl.Length > 0 &&
                returnUrl.StartsWith("/") &&
                !returnUrl.StartsWith("//") &&
                !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "Username and Password combination is incorrect");
        }
    }

    return View();
}

Мой вопрос, с перегруженным методом Login() (для HTTP POST), что вызывает этот метод с первым параметромкак LoginModel класс, а второй параметр как string?В моем представлении Login.cshtml используется кнопка отправки, поэтому мне интересно, как эти параметры передаются методу Login()?Что мешает мне добавить третий параметр?И как этот параметр будет передан ??

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

Ответы [ 2 ]

9 голосов
/ 31 октября 2011

Этот процесс называется связыванием моделей, на нем много ресурсов ... Я бы начал с Как реализовать пользовательский, потому что из этого вы поймете, как и почему этот процесс работает.

http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/ http://bradwilson.typepad.com/blog/2010/10/service-location-pt9-model-binders.html

РЕДАКТИРОВАТЬ:

Существует привязка модели по умолчанию, которая принимает элементы в коллекции записей, такие как данные формы и параметры URL, и пытается сопоставить их с элементамичто вы сказали диспетчеру ожидать.Это работает примерно так ...

Приходит запрос, MVC решает, какой контроллер должен получить запрос, а затем MVC смотрит на метод HTTP, это был GET или POST?Если это был пост, то он ищет действие контроллера с атрибутом HttpPost MVC, а затем смотрит на параметры, которые вы определили ...

В вашем случае он говорит, что у меня есть LoginModel и returnUrl;MVC теперь доволен - он знает, куда идут дела, поэтому теперь он смотрит на то, что вы отправили ... Он просматривает ваши почтовые данные (поля формы и параметры строки запроса) Один за другим он просматривает их имена, а затем пытается найтисовпадение параметров вашего контроллера.

Он находит поле имени пользователя в данных формы, смотрит на ваши параметры и спрашивает, есть ли имя пользователя?Нет, может быть, Имя пользователя является свойством LoginModel ... оно затем просматривает LoginModel.Ага это говорит, нашел один.Затем MVC создает экземпляр LoginModel и присваивает свойству Username значение, которое вы указали.

Этот процесс продолжается для каждой вещи, найденной в вашей форме и строке запроса.Ниже приведено множество правил, но вы получите представление - это соответствие является частью красоты MVC «соглашение о конфигурации».

Весь этот процесс над связыванием модели, и поскольку MVC реализует это поведение по умолчанию, вы не видите его записанным в Global.asax или чем-либо еще, это просто часть MVC.

1 голос
/ 11 июня 2012

Посмотрите на ваше представление LogOn, здесь метод post получает параметр returnUrl

Html.BeginForm ("LogOn", "Account", new {returnUrl = @ Request.QueryString["ReturnUrl"] }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...