Как сохранить список объектов в модели на HttpPost? - PullRequest
0 голосов
/ 27 марта 2012

У меня есть модель, которая содержит список пользовательского типа.

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

Однако, похоже, он не делает то, что я хочу. Я дошел до того места, где следую, Передав IEnumerable или список Model в контроллер с помощью HttpPost , но у меня возникла проблема.

Мой метод управления:

    [HttpPost]
    public ActionResult UpdateStock(int id, ProductModel model)
    {
        return View("UpdateStock", model);
    }

Теперь представление выглядит так (обрезано):

@using (Html.BeginForm())
{
<div>
    <p>
    <input type="submit" value="Save" />
    </p>

    @Html.HiddenFor(m => m.ProductNo)

    <div class = "title">
    @Html.LabelFor(m => m.ProductName)
    @Html.EditorFor(m => m.ProductName)
    </div>

            @for ( int i = 0; i < Model.Stock.Count; i++ )
            {
                var item = Model.Stock[i];
                <div class="editor-field">
                    <input type="text" name="Model.Stock[@i].Key"
                        value="@item.Key" />
                </div>
                <div class="editor-field">
                    <input type="text" name="Model.Stock[@i].Value"
                        value="@item.Value" />
                </div>
            }
}

Моя проблема в том, что теги @Html.EditorFor() и <input type=.../>, похоже, плохо взаимодействуют друг с другом. Если у меня так, как указано выше, то ProductNo и другие свойства, использующие методы @Html, не будут переданы модели.

Любой совет высоко ценится.

1 Ответ

2 голосов
/ 27 марта 2012

Я бы просто использовал шаблоны редактора:

Модель:

public class ProductModel 
{
    public string ProductNo { get; set; }
    public string ProductName { get; set; }
    public IEnumerable<Stock> Stocks { get; set; }
}

public class Stock
{
    public string Key { get; set; }
    public string Value { get; set; }
}

Контроллер:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new ProductModel 
        {
            ProductNo = "123",
            ProductName = "p name",
            Stocks = new[]
            {
                new Stock { Key = "key1", Value = "value1" },
                new Stock { Key = "key2", Value = "value2" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ProductModel model)
    {
        ...
    }
}

Вид:

@model ProductModel
@using (Html.BeginForm())
{
    <p>
        <input type="submit" value="Save" />
    </p>

    @Html.HiddenFor(m => m.ProductNo)

    <div class = "title">
        @Html.LabelFor(m => m.ProductName)
        @Html.EditorFor(m => m.ProductName)
    </div>

    @Html.EditorFor(x => x.Stocks)
}

изатем вы определяете пользовательский шаблон редактора для типа акций (~/Views/Shared/EditorTemplates/Stock.cshtml):

@model Stock
<div class="editor-field">
    @Html.EditorFor(x => x.Key)
</div>
<div class="editor-field">
    @Html.EditorFor(x => x.Value)
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...