Как передать модель с перечисляемым объектом в View? [Дубликат]

1

Я новичок в ASP.MVC4, и перед вами стоит задача передать объект из представления в контроллер: позвольте мне объяснить мою проблему с начала: Мой класс, который используется, например: UserAndRolesModel

public class UserAndRolesModel
{
    public user User { get; set; }
    public IEnumerable<UserAndRoles> AsignedRoles { get; set; }
}

Как вы можете видеть класс UserAndRolesModel сохраняется из 2 объектов: user и Enumerable

public class user
{
    [HiddenInput(DisplayValue=false)]
    public virtual int user_id { get; set; }

    [Required(ErrorMessage = "Please provide name")]
    [Display(Name = "Name")]
    public virtual string user_name { get; set; }

    [Display(Name = "Is active?")]
    public virtual bool user_active { get; set; }

}

public class UserAndRoles
{
    public string RoleName { get; set; }
    public bool IsAssigned { get; set; }
}

Мое действие контроллера простое, он назначает пользователя UserWithRoles.User и создает tempList с объектами UserAndRoles.

    public ActionResult Edit(int userid=0)
    {
      //object which will be passed to View
      UserAndRolesModel UserWithRoles = new UserAndRolesModel();

      //user
      UserWithRoles.User = repoUsers.Users.FirstOrDefault(x => x.user_id == userid);

      //roles
      IList<UserAndRoles> tempList = new List<UserAndRoles>();
      UserAndRoles temp1 = new UserAndRoles();
      temp1.RoleName="Admin";
      temp1.IsAssigned=true;
      UserAndRoles temp2 = new UserAndRoles();
      temp2.RoleName="User";
      temp2.IsAssigned=false;
      tempList.Add(temp1);
      tempList.Add(temp2);

      //assign tempList to model
      UserWithRoles.AsignedRoles = tempList;

      return View(UserWithRoles);
    )

На этом этапе я успешно перехожу к View:

UserWithRoles.User.user_id=1;
UserWithRoles.User.user_name="UserName1";
UserWithRoles.User.user_active=true;
UserWithRoles.AsignedRoles[1].RoleName = "Admin";
UserWithRoles.AsignedRoles[1].IsAssigned = true ;
UserWithRoles.AsignedRoles[2].RoleName = "User";
UserWithRoles.AsignedRoles[2].IsAssigned = false;

Я могу отобразить выше Просмотр правильно:

@model Models.UserAndRolesModel
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <div class="editor-field">
            @Html.EditorFor(model => model.User.user_id)
            @Html.ValidationMessageFor(model => model.User.user_id)
        </div>


        <div class="editor-label">
            @Html.LabelFor(model => model.User.user_name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.User.user_name)
            @Html.ValidationMessageFor(model => model.User.user_name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.User.user_active)
        </div>
        <div class="editor-field">
            @Html.CheckBoxFor(model => model.User.user_active)
            @Html.ValidationMessageFor(model => model.User.user_active)
        </div>

        <br /> ROLES below is piece of code which makes me cry<br />
        @foreach (var item in Model.AsignedRoles)
        {
            <div class="editor-field">
            <div class="editor-field">
               @Html.LabelFor(model => item.RoleName)
               @Html.CheckBoxFor(model => item.IsAssigned)
            </div>
            </div>
        }

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

Когда я нажимаю "Отправить", все данные, касающиеся пользователя, были переданы правильно, но IEnumerable AsignedRoles всегда имеет значение null. Вот мой метод контроллера на пост:

[HttpPost]
public ActionResult Edit(UserAndRolesModel UserWithRoles)
    {
        if (ModelState.IsValid)
        {
                        if (UserWithRoles.AsignedRoles==null)
                            Console.WriteLine("I am still crying");
                        else
                            Console.WriteLine("Got it!");
        }
        return View(UserWithRoles);
    }

В представлении я попытался использовать другие циклы, например:

    @for (int i = 0; i < Model.AsignedRoles.Count(); i++)
    {
             <div class="editor-field">
               @Html.LabelFor(model => item[i].IsAssigned)
               @Html.CheckBoxFor(model => item[i].IsAssigned)
             </div>
    }

Но выше также не проходит IEnumerable. Может ли кто-нибудь помочь мне решить эту проблему? Как я могу перейти к контроллеру UserAndRolesModel, который содержит IEnumerable? Я буду очень благодарен. Спасибо за помощь!

  • 0
    Можете ли вы использовать Fiddler, чтобы увидеть, что на самом деле отправляется обратно?
  • 1
    Вы пытались использовать IList вместо IEnumerable ? Кроме того, потому что я не могу не комментировать это; AsignedRoles отсутствует s, а UserWithRoles не соответствует вашему соглашению о lowerCasedVariableNames.
Показать ещё 3 комментария
Теги:
razor
asp.net-mvc
asp.net-mvc-4

1 ответ

1

Вам нужен цикл for, но тот, который вы попробовали, ссылался на item[i], но item[i] больше не существует. Попробуйте это, обратите внимание, что я также добавил HiddenFor для RoleName иначе это не будет передано обратно:

@for (int i = 0; i < Model.AsignedRoles.Count(); i++)
{
         <div class="editor-field">
           @Html.LabelFor(model => model.AssignedRoles[i].IsAssigned)
           @Html.CheckBoxFor(model => model.AssignedRoles[i].IsAssigned)
           @Html.HiddenFor(model => model.AssignedRoles[i].RoleName)
         </div>
}
  • 0
    Спасибо mattytommo за ответ! Проблема была в IEnumerable и IList, но ваш фрагмент кода помогает мне разобраться. Спасибо, ребята, за помощь !!!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню