Модель (сложный тип) не подчиняется действию

У меня возникла проблема с публикацией формы с моделью «сложного типа»:

У меня есть модель:

public class CircleEditViewModel
    {
        [Key]
        public int CircleId { get; set; }

        [Required]
        [MaxLength(100)]
        public string Name { get; set; }

        public bool IsSystem { get; set; }
        public class UserInCircle
        {
            public UserInCircle(User user)
            {
                this.UserId = user.UserId;
                FullName = user.FullName;

            }
            public int UserId { get; set; }
            public byte[] Picture { get; set; }
            public string FullName { get; set; }
            public bool isInCircle { get; set; }
        }
          public List<UserInCircle> Users { get; set; }
    }

Моя первая проблема заключалась в том, что в пост-событии мои пользователи были нулевыми.. поэтому я следил за несколькими сообщениями здесь (например, Привязка модели MVC к сложному типу), чтобы использовать for вместо foreach, но так как я это сделал, мой форма больше не будет публиковаться:

Вид:

      @model Wims.Website.ViewModels.CircleEditViewModel
        <script type="text/javascript">
            $(document).ready(function () {

                $.validator.unobtrusive.parse('form');
            });


        </script>
@using (Ajax.BeginForm(Html.ViewContext.RouteData.Values["Action"].ToString(), null, new AjaxOptions { HttpMethod = "POST", OnSuccess = "SaveDone(data)" }, new { id = "editform" }))
{
    @Html.ValidationSummary(true)

            <fieldset>
                <legend>Circle</legend>
                @Html.Label(DateTime.Now.ToString());
            <div class="editor-label">
                @Html.LabelFor(model => model.Name)
            </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Name)
                    @Html.ValidationMessageFor(model => model.Name)
                </div>
            </fieldset>

            if (Model.Users != null)
            {
                for (int i = 0; i < Model.Users.Count; i++)
                {            
                    <div class="userDetail">
                        <div>
                            <div>
                                @Html.DisplayFor(model => Model.Users[i].isInCircle);
                            </div>
                            <div class="iconDiv">
                                @Html.Image("~/Content/Images/defaultUser.jpg", Model.Users[i].FullName, null);
                            </div>
                            <div>     
                                 @Html.TextBoxFor(model => Model.Users[i].FullName)
                                 @Html.HiddenFor(model => Model.Users[i].UserId)

                            </div>
                        </div>

                    </div>
                    <div style="clear: both"></div>
                }
            }
         @Html.GenerateSecureDataControls(model => model.CircleId)
            <input type="submit" value="Save" />
        }

Мое представление отображается как частично загруженное через ajax (не уверен, что здесь есть какая-то разница). Любая идея, почему это не опубликует? Если я удалю все «[]», такие как «Users[0].FullName» в Users0.FullName, я опубликую, но, конечно, это не будет связано.

Спасибо за вашу помощь

Отредактируйте на всякий случай: Действие:

[HttpPost]
    public ActionResult Edit(CircleEditViewModel circleData, FormCollection collection)
    {
        if (ModelState.IsValid)
        {
            using (var logic = new CircleLogic())
            {
                Circle circle = logic.GetCircleById(circleData.CircleId, WebMatrix.WebData.WebSecurity.CurrentUserId);
                if (circle == null)
                {
                    return HttpNotFound();
                }
                else
                {

                    circle.Name = circleData.Name;
                    logic.UpdateCircle(circle, GetSelectedUser(collection));

                }
                return PartialView("_CircleAndUsers", GetData(logic, circle.CircleId));
            }
        }

        return this.Json(new { success = false, viewdata = RenderRazorViewToString("_CircleAndUsers", circleData) });

    }

person Tom    schedule 25.11.2012    source источник
comment
Не могли бы вы поделиться сгенерированным html формы?   -  person Amith George    schedule 25.11.2012
comment
Возможно, вы захотите добавить конструктор по умолчанию в UserInCircle. Я не думаю, что связыватель модели сможет создать экземпляр этого типа без него.   -  person Pablo Romeo    schedule 26.11.2012
comment
Пабло Ромео был прав, я добавил ctor по умолчанию, и это сработало. Я не думаю, что когда-нибудь доберусь до этого в одиночку. Спасибо! (ps Пабло Ромео, не стесняйтесь указывать это как ответ, чтобы я мог пометить его как решенный, отдав вам должное :))   -  person Tom    schedule 26.11.2012


Ответы (1)


Пабло Ромео был прав, я добавил ctor по умолчанию, и это сработало.

person Tom    schedule 04.03.2013