Привязка модели к спискам - PullRequest
1 голос
/ 09 июля 2011

Как сделать списки дескрипторов привязки модели по умолчанию?

Допустим, у меня есть класс ShoppingCart, у которого есть список ShoppingCartItem:

Public Class ShoppingCart
  Public Property CouponCode As String
  Public Property Items As New List(Of ShoppingCartItem)
End Class

Public Class ShoppingCartItem
  Public Property Title As String
  Public Property Count As Integer
End Class

Мой взгляд выглядит следующим образом (согласно совету этого и этого , поста в блоге):

@ModelType VAVTag.LuckyDraw.ShoppingCart

@Code
  Layout = Nothing
End Code
<!DOCTYPE html>
<html>
<head runat="server">
  <title>Index</title>
</head>
<body>
  @Using Html.BeginForm()
    @<fieldset>
      <legend>ShoppingCart</legend>
      @Html.TextBoxFor(Function(m) m.CouponCode)
      <hr />
      @Html.EditorFor(Function(m) m.Items)

      <p>
        <input type="submit" value="Save" />
      </p>
    </fieldset>
  End Using
</body>
</html>

Элементы отображаются с помощью EditorTemplate (спасибо Darin ):

@ModelType ShoppingCartItem
@Html.EditorFor(Function(m) m.Title )
@Html.EditorFor(Function(m) m.Count )
<br />

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

Public Class ShoppingCartController
  Inherits System.Web.Mvc.Controller

  Function Index() As ActionResult
    Dim model As New ShoppingCart
    model.Items.Add(New ShoppingCartItem With {.Count = 1, .Title = "Item A"})
    model.Items.Add(New ShoppingCartItem With {.Count = 17, .Title = "Item B"})
    model.Items.Add(New ShoppingCartItem With {.Count = 100, .Title = "Item C"})

    Return View(model)
  End Function

  <HttpPost()>
  Function Index(model As ShoppingCart) As ActionResult
    Return View(model) ' model is empty!
  End Function
End Class

Однако, когда я отправляю страницу, никакие значения не выбираются, даже поле CouponCode. Модельный объект пуст. Что дает?

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

Обновление: я просто пропустил ключевое слово Property в моих объявлениях свойств модели. Уже слишком поздно, и мне нужно немного поспать. :)

1 Ответ

2 голосов
/ 09 июля 2011

Как создать списки дескрипторов привязки модели по умолчанию?

Подшивка модели по умолчанию уже обрабатывает списки и словари отлично.

Просто используйте шаблоны редактора. Например:

Посмотреть модель:

public class ShoppingCartItem
{
    public string Title { get; set; }
    public int Count { get; set; }
}

public class ShoppingCart
{
    public string CouponCode { get; set; }
    public List<ShoppingCartItem> Items { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new ShoppingCart
        {
            Items = new[]
            {
                new ShoppingCartItem { Count = 1, Title = "Item A" },
                new ShoppingCartItem { Count = 17, Title = "Item B" },
                new ShoppingCartItem { Count = 100, Title = "Item C" },
            }.ToList()
        };
        return View(model);
    }

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

Вид:

@model ShoppingCart
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
    @using (Html.BeginForm())
    {
        <fieldset>           
            <legend>ShoppingCart</legend>
            @Html.TextBoxFor(x => x.CouponCode)
            <hr/>
            @Html.EditorFor(x => x.Items)
        </fieldset>
        <p>
            <input type="submit" value="Save" />
        </p>
    }
</body>
</html>

и, наконец, шаблон редактора (~/Views/Home/EditorTemplates/ShoppingCartItem.cshtml), который будет отображаться для каждого элемента коллекции Items:

@model ShoppingCartItem
@Html.EditorFor(x => x.Title)
@Html.EditorFor(x => x.Count)
...