ASP.NET MVC 3 Привязка к коллекции внутри объекта - PullRequest
1 голос
/ 10 февраля 2012

У меня есть модель с объектом, который содержит коллекцию, подобную этой:

namespace API.Example.Models
{
    public class OrderTest
    {
        public string UserName { get; set; }

        public string Token { get; set; }

        public POCO.Order Order { get; set; }

    }
}

namespace Supertext.API.POCO
{
    public class Order
    {
        public List<TranslationGroup> Groups = new List<TranslationGroup>();
    }


    public class TranslationGroup
    {
        public string GroupId { get; set; }
    }
}

Объект Order содержит коллекцию под названием Groups.
В представлении я отображаю коллекцию следующим образом (с индексом, как описано в нескольких примерах)

@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)

@for (int i = 0; i < Model.Order.Groups.Count; i++)
{ 
    @Html.LabelFor(m => Model.Order.Groups[i].GroupId)
    @Html.TextBoxFor(m => Model.Order.Groups[i].GroupId)
}

И это метод Controller, который вызывается:

[HttpPost]
public ActionResult Index(Models.OrderTest model)

HTML-код элемента UserName:

<input id="UserName" name="UserName" style="width:300px;" type="text" value="">

и элемент GroupId:

<input id="Order_Groups_0__GroupId" name="Order.Groups[0].GroupId" type="text" value="1">

Я могу получить доступ к UserName, но в коллекции ничего нет.
Что мне не хватает? И в чем разница между использованием m.UserName и Model.Order.Groups (я имею в виду m и Model). Это моя проблема?

1 Ответ

2 голосов
/ 10 февраля 2012

Каждое свойство объекта POCO используется как свойство, управляемое CLR. Позвольте CLR управлять созданием экземпляра и т. Д., Или вы можете создавать конфликты, которые могут вызвать проблемы, как у вас.

Измените код заказа на:

public class Order     
{         
    public List<TranslationGroup> Groups { get; set; }    
}  

- EDIT

Я создаю новый проект и добавляю следующий класс:

public class TranslationGroup
{
    public string GroupId { get; set; } 
}

public class Order
{
    public List<TranslationGroup> Groups { get; set; }
}

public class OrderTest 
{ 
    public string UserName { get; set; } 
    public string Token { get; set; } 
    public Order Order { get; set; } 
} 

Вот мой код позади OrderTestController:

public ActionResult Index()
{
    var orderTest = new Models.OrderTest()
    {
        UserName = "Vinicius",
        Token = "12as1da58sd558",
        Order = new Models.Order()
        {
            Groups = new List<Models.TranslationGroup>()
            {
                new Models.TranslationGroup() { GroupId = "a54s"},
                new Models.TranslationGroup() { GroupId = "a87d"},
                new Models.TranslationGroup() { GroupId = "2gf4"}
            }
        }
    };


    return View(orderTest);
}

[HttpPost]
public ActionResult Index(Models.OrderTest model)
{
    return View();
}

И индексный просмотр:

@model TestCollection.Models.OrderTest
@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>OrderTest</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Token)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Token)
            @Html.ValidationMessageFor(model => model.Token)
        </div>
        @for (int i = 0; i < Model.Order.Groups.Count; i++)
        {     
            <div class="editor-label">
                @Html.LabelFor(m => Model.Order.Groups[i].GroupId)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => Model.Order.Groups[i].GroupId)
            </div>
        }
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Итак, если вы запустите и перейдете в представление OrderTest, вы увидите, что все атрибуты заполнены, и когда вы нажмете кнопку «Создать», все вещи будут связаны (также и коллекция).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...