Привязка модели для модели представления, содержащей несколько объектов - PullRequest
0 голосов
/ 16 июля 2010

У меня строго типизированное представление типа ProductListingViewModel, которое, в свою очередь, содержит ProductViewModel.(обе модели пользовательских представлений).

У меня есть несколько элементов формы на моей странице, и они создаются следующим образом:

<%: Html.DropDownListFor(m => m.ProductViewModel.CategoryId, Model.Categories)%>

, который генерирует HTML:

<select name="ProductViewModel.CategoryId" id="CategoryId">

При связывании модели по умолчанию я ожидал, что когда я опубликую в своем действии контроллера, которое принимает параметр типа ProductListingViewModel, он будет знать, чтобы заполнить ProductViewModel.CategoryId соответствующими данными.

Имясписок выбора, по-видимому, указывает на то, что он знает, что существует ProductViewModel со свойством CategoryId, однако когда я отправляю сообщение в свой метод контроллера, ProductViewModel имеет значение null.Если я создаю это во время создания ProductListingViewModel, то он больше не равен нулю, но связыватель по умолчанию, по-видимому, не заполняет свойства, как я ожидал.

Это случай для связывателя пользовательской модели или я простоупустить что-то фундаментальное?

Приветствия.

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Позвольте мне попытаться подвести итог (поправьте меня, если я ошибаюсь).

Модель:

public class ProductListingViewModel
{
    public ProductViewModel ProductViewModel { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; }
}

public class ProductViewModel
{
    public string CategoryId { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new ProductListingViewModel
        {
            Categories = new SelectList(new[]
            {
                new { Value = "1", Text = "category 1" },
                new { Value = "2", Text = "category 2" }
            }, "Value", "Text")
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ProductListingViewModel model)
    {
        return View(model);
    }
}

Просмотр:

<% using (Html.BeginForm()) { %>
    <%: Html.DropDownListFor(m => m.ProductViewModel.CategoryId, Model.Categories)%>
    <input type="submit" value="OK" />
<% } %>

Теперь, когда вы отправите форму, вы получите:

model.ProductViewModel.CategoryId = the id that was selected in the drop down list

Не то, что вы ищете?

0 голосов
/ 16 июля 2010

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

Вы пытались использовать Fiddler для проверки данных, отправленных с клиента?

Что именно является подписьюдействие контроллера?

...