MVC 2 asp.net VC2010: где происходит «привязка данных»? - PullRequest
1 голос
/ 13 августа 2010

Понимание вопроса:

1.) Класс "X_IndexViewModel"

public class X_IndexViewModel
{
   public List<SelectListItem> CheckBox_1 { get; set; } 
   ...
}

2.) XController.cs

public ActionResult Index()
{ 
    X_IndexViewModel viewModel = new X_IndexViewModel
    {
        CheckBox_1 = new List<SelectListItem>() 
        {
            new SelectListItem 
            {   
                Selected = true,
                Text = "some text",
                Value ="another text"
            }
        },    
        ... 
    }
    return View(viewModel);
}

3.) Индекс веб-сайта.aspx ", который наследует" X_IndexViewModel "

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Test.ViewModels.X_IndexViewModel>" %>
   ...      
   <!-- rendering a checkbox -->
   <% foreach (var item in Model.CheckBox_1) { %> 
   <%: Html.CheckBox("CheckBox_1", item.Selected, new {id="CheckBox_1"}) %>
       <label for="CheckBox_1<%: item.Text %>"><%: item.Text %></label> 
   <% } %>
   ...

4)" Реальный "класс модели" XModel "содержит просто bool для хранения информации, выбрал ли пользователь флажок или нет ...

public class XModel
{
    public bool CheckBox_1 {get; set;}
    ...
}

5) И в "XController.cs"

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(XModel model, FormCollection Form)

Меня удивляет, что аргумент model метода POST ActionResult хорошо заполнен true или false дляcheckbox.

Что я не понял:

Я использую экземпляр класса X_IndexViewModel (X_IndexViewModel viewModel = new X_IndexViewModel { ... }), чтобы заполнить флажок некоторыми значениями (например, selected = true или falseи т. д.).

Затем отображается веб-сайт с использованием viewModel (где viewModel - это экземпляр класса X_IndexViewModel).Это прекрасно работает, потому что веб-сайт наследует X_IndexViwModel.

Когда пользователь отправляет форму, это событие (событие post), выбираемое методом [AcceptVerbs(HttpVerbs.Post)] ActionResult И свойства класса XModel заполняютсясо значением флажка.

Итак, мой вопрос:

Где происходит связывание между "X_IndexViewModel" и "XModel"?

Какой оператор говорит: Возвращенныйзначение X_IndexViewModel CheckBox1 должно храниться в свойстве XModel CheckBox1?

1 Ответ

2 голосов
/ 13 августа 2010

После долгих правок и перечитывания вашего поста, думаю, я понимаю, о чем вы спрашиваете. Причина, по которой X_IndexViewModel связывается с созданным вами CheckBox, заключается в том, что CheckBox назван точно так же, как и свойство модели. Они оба названы CheckBox1.

Здесь происходит волшебство ASP.NET MVC. Он сопоставляет свойства моделей со значениями, в которых совпадают имена, и можно загрузить значения.

Итак, когда элементы управления размещены, происходит обратное. Неважно, что для получения данных используется другой класс, поскольку он сопоставляет имена свойств и ожидаемые типы. Поскольку данные отправляются в контроллер, у которого есть модель со свойством, имя которого совпадает с именем элемента управления CheckBox в HTML, он автоматически вводит значение. Все это происходит за кулисами инфраструктурой MVC, и мне нравится чтобы назвать это ВОЛШЕБНЫЙ СОУС MVC .

Если вы хотите проверить это, возьмите точный пример и измените имя свойства XModel bool на CheckBox2. Значения не будут автоматически выбрасываться в принимающую модель, поскольку имя свойства больше не соответствует имени элемента управления (ID) HTML.

Вы также можете сделать то же самое с исходной моделью, которую вы передаете, для создания вида (X_IndexViewModel). Измените его на CheckBox2, и HTML больше не будет автоматически отражать значение в модели, поскольку свойство модели CheckBox2 не соответствует имени элемента управления, которое является CheckBox1.

Вот некоторые другие ссылки, которые вы можете прочитать, которые имеют больше примеров и объяснений:

  1. Привязка модели ASP.NET MVC
  2. Переплет модели ASP.NET MVC 2 для коллекции
  3. 6 Советы по привязке модели ASP.NET MVC
...