Передача значений между View и Controller в MVC 2 - PullRequest
0 голосов
/ 18 августа 2010

Меня постоянно смущает, как передавать значения между представлениями и контроллерами в MVC. Я знаю, что могу установить ViewData в контроллере и использовать его в представлении, но как быть наоборот?

Я обнаружил, что могу использовать скрытое поле и затем обращаться к нему через Request.Form ["name"] следующим образом:

<% using (Html.BeginForm("Upload", "Customers", FormMethod.Post, new { enctype = "multipart/form-data" }))
   {%>
<br />
<input id="currentDir" type="hidden" name="currentDir" value="" />
<input type="file" name="fileTextbox" id="fileTextbox" />
<br />
<br />
<input type="submit" value="Send" />
<% } %>

Что еще больше усложняет то, что значение изначально исходит из скрипта jquery, поэтому поле ввода было единственным способом, о котором я мог думать. Но это все еще кажется неправильным ... Возможно, это не так, но я бы хотел узнать, есть ли другие более "правильные" установленные способы передачи значений между View и Controller (оба способа). Нужно ли вместо этого использовать строки запроса? Если так, как они будут выглядеть в html.beginform htmlhelper?

Кроме того, здесь я пытаюсь включить возможности загрузки для своего приложения. И я стараюсь сделать все приложение максимально «Ajaxy». Но эта форма сделает полный пост. Есть ли другой способ сделать это и не нужно перезагружать всю страницу для этой загрузки?

1 Ответ

1 голос
/ 11 февраля 2011

Давайте на мгновение проигнорируем аспекты «AJAX-y» (потому что это другая проблема) и просто рассмотрим передачу данных между представлениями и контроллерами.Сначала я бы порекомендовал вам ознакомиться с NerdDinner Tutorial , который дает хорошее представление о том, как работает MVC и как вы используете некоторые функции MVC.

Чтобы ответить на конкретный вопрос о том, какданные передаются из View в Controller и обратно, есть несколько способов сделать это.Однако для большинства людей имеет смысл использовать строго типизированные представления.

Допустим, у вас есть модель с именем Person.Пока что не беспокойтесь о том, как мы храним данные Person - у нас просто есть класс Person в папке Models внутри вашего MVC-проекта.

public class Person {

  public string FirstName;
  public string LastName;

  public Person() {
    FirstName = "John";
    LastName = "Doe";
  }
}

Когда мы хотим отобразить данные о Person в представлении,мы делаем запрос к конкретному контроллеру.В этом случае (и для ясности) мы назовем этот контроллер MainController.Это перейдет в папку Controllers и будет называться MainController.Давайте назовем Action (действие на самом деле просто специализированный метод), мы хотим получить данные из Index.Из-за того, как работает маршрутизация ASP.NET MVC, путь к нашему серверу будет: http://localhost/Main/Index. Обратите внимание на контроллер (без имени «Контроллер»), а путь - действие.(Первая часть - это, конечно же, имя вашего сервера.)

Давайте посмотрим на ваш контроллер. Сейчас я сделаю это очень просто:

public class MainController : Controller {

  public ActionResult Index() {
    Person person = new Person();
    return View(person);
  }
}

Что мы собираемся сделатьвнутри Индексного действия есть то, что он возвращает представление (которое по умолчанию имеет то же имя, что и действие) и модель, соответствующую этому представлению.Теперь нам нужно создать наше представление.

Важной частью здесь является то, что вы хотите строго ввести модель, которая возвращается в контроллере вашему представлению.Вы делаете это с помощью этой строки (которая является первой в вашем aspx-файле).

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewUserControl<Project.Namespace.Person>" %>

Обратите внимание на атрибут «Наследование» и обратите внимание, что ваша модель Person составляет этот атрибут.

Теперь,просто закодируйте остальную часть вашего взгляда как обычно.Допустим, мы хотим отобразить текущее имя человека и позволить кому-то изменить имя.Страница выглядела бы так (я не делаю это красиво):

<% using (Html.BeginForm()) { %>
  <%: Html.LabelFor(model => model.FirstName) %>
  <%: Html.TextBoxFor(model => model.FirstName) %>
  <%: Html.LabelFor(model => model.LastName) %>
  <%: Html.TextBoxFor(model => model.LastName) %>

  <input type="submit" value="Submit" name="submitButton" />
<% } %>

Это важная часть о передаче данных между контроллерами и представлениями.Что мы делаем здесь, так это то, что мы берем ваше строго типизированное представление (которое типизируется классом Person) и используем вспомогательные методы (такие как LabelFor и TextBoxFor), чтобы связать модель вместе с ее данными и, в конечном счете, вместе с действиями.содержится в контроллере (который мы должны закончить здесь в одно мгновение).

Итак, теперь вы можете видеть данные.Но если пользователь меняет имя и нажимает кнопку «Отправить» - мы хотим, чтобы на странице отображалось новое имя.Это означает, что нам нужно добавить еще одно действие в MainController - то, которое получает данные.

[HttpPost]
public ActionResult Index(Person person) {
  // Do whatever you want with the Person model. Update a database, or whatever.
  return View(person);
}

Это действие очень похоже на другое действие, которое мы только что разработали.Тем не менее, он берет объект person (из формы, которая отправляется) и дает контроллеру возможность делать все, что нужно сделать с этим объектом.После того, как это будет сделано, вы можете выбрать перенаправление на другую страницу, переотображение страницы (полезно при наличии ошибок) или другие действия.

Опять же, это ВСЕ покрыто (и многое другое).) в NerdDinner Tutorial .Я настоятельно рекомендую вам прочитать и выполнить это.

Что касается рассмотренных вами аспектов AJAX-y, то посылка остается той же (хотя есть небольшая часть работы с JavaScript / jQuery, которая там продолжается),Сейчас я не буду вдаваться в подробности, но основы также описаны в учебнике NerdDinner .

Надеюсь, это поможет вам начать.Я тоже немного запутался, когда впервые начал работать с веб-технологиями, поэтому надеюсь, что это вам поможет!

...