Khloud Ali Ответов: 2

Модель возвращает нулевые значения


привет,
таким образом, моя функция Get работает нормально, и я ищу пользователя и получаю его доступ к вещам в списке флажков. проблема в том, что когда я выбираю другой флажок и нажимаю кнопку сохранить модель, переданную в функцию post с идентификатором поиска, это нули. Не знаю почему. разве модель, переданная из представления, не должна содержать значения?

мой контроллер:

public ActionResult Index(int? SearchId)
        {
            var MainVM = new MainViewModel();
            var usr_Dep = db.TBL_User_Dep_Access.Where(x => x.UserID == SearchId).Select(x => x.Dep_ID).ToList();
            var usr_Per = db.TBL_UserPermissions.Where(x => x.UserID == SearchId).Select(x => x.PermissionID).ToList();

            if (SearchId != null)
            {
                List<UserDepartmentViewModel> Udep = db.TBL_Department.Select(i => new UserDepartmentViewModel
                {
                    DepId = i.Department_ID,
                    DepName = i.Department_Name,
                    IsChecked = usr_Dep.Contains(i.Department_ID)

                }).ToList();

                List<UserPermissionViewModel> Uper = db.TBL_Permissions.Select(i => new UserPermissionViewModel
                {
                    PerId = i.PermissionID,
                    PerName = i.PermissionName,
                    IsChecked_ = usr_Per.Contains(i.PermissionID)

                }).ToList();

                MainVM.UserDepartments = Udep;
                MainVM.UserPermissions = Uper;
            }
               
          
            
            return View(MainVM);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult SaveData (MainViewModel mainView , int? SearchId)
        {
            db.TBL_UserPermissions.RemoveRange(db.TBL_UserPermissions.Where(x => x.UserID == SearchId));
            db.TBL_User_Dep_Access.RemoveRange(db.TBL_User_Dep_Access.Where(x => x.UserID == SearchId));
            foreach (var dep in mainView.UserDepartments)
            {
                if (dep.IsChecked)
                {
                    TBL_User_Dep_Access tBL_User_Dep_ = new TBL_User_Dep_Access();
                    tBL_User_Dep_.UserID = SearchId;
                    tBL_User_Dep_.Dep_ID = dep.DepId;
                    tBL_User_Dep_.IsActive = true;
                    db.TBL_User_Dep_Access.Add(tBL_User_Dep_);
                }
            }
            db.SaveChanges();

            foreach (var per in mainView.UserPermissions)
            {
                if (per.IsChecked_)
                {
                    TBL_UserPermissions tBL_UserPermissions = new TBL_UserPermissions();
                    tBL_UserPermissions.UserID = SearchId;
                    tBL_UserPermissions.PermissionID = per.PerId;
                    tBL_UserPermissions.IsActive = true;
                    db.TBL_UserPermissions.Add(tBL_UserPermissions);
                }
            }
            db.SaveChanges();
            return View();
        }


мой взгляд :
@using (Html.BeginForm("Index", "Access"))
{
    @Html.AntiForgeryToken()
    @Html.TextBox("SearchId", "", new { @id = "SearchId", @placeholder = "Search for...", @class = "form-control" })
    <span class="input-group-btn">
        <input class="btn btn-default" value="Search" type="submit">Go! />
    </span>
}
@using (Html.BeginForm("SaveData", "Access"))
{
    @Html.AntiForgeryToken()
        <ul>
            @if (Model.UserDepartments != null)
            {
                foreach (var item in Model.UserDepartments)
                {
                    <li>
                        <p>
                            @Html.CheckBoxFor(modelItem => item.IsChecked)
                            @Html.DisplayFor(modelItem => item.DepName)
                            @Html.HiddenFor(modelItem => item.DepId)

                        </p>

                    </li>

                }
            }

        </ul>


        <ul>
            @if (Model.UserPermissions != null)
            {
                foreach (var item in Model.UserPermissions)
                {
                    <li>
                        <p>
                            @Html.CheckBoxFor(modelItem => item.IsChecked_)
                            @Html.DisplayFor(modelItem => item.PerName)
                            @Html.HiddenFor(modelItem => item.PerId)

                        </p>

                    </li>

                }
            }

        </ul>


        <input type="submit" value="Save" class="btn btn-default" onclick="onClick" />
}


моя модель представления:
public class MainViewModel
   {
       public int SearchId { get; set; }
       public List<UserPermissionViewModel> UserPermissions { get; set; }
       public List<UserDepartmentViewModel> UserDepartments { get; set; }

   }


   public class UserDepartmentViewModel
   {
       public int DepId { get; set; }
       public string DepName { get; set; }
       public bool IsChecked { get; set; }

   }

   public class UserPermissionViewModel
   {
       public int PerId { get; set; }
       public string PerName { get; set; }
       public bool IsChecked_ { get; set; }


   }


Что я уже пробовал:

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

2 Ответов

Рейтинг:
2

NithyaKumarJai

if (SearchId != null)
            {
}
вы назначаете список моделей внутри поиска not null
MainVM.UserDepartments = Udep;
               MainVM.UserPermissions = Uper;

Так что вы не получите то
UserDepartments 
UserPermissions 
данные если Null из SearchId


Рейтинг:
1

Richard Deeming

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

То SearchId входные данные находятся в другой форме, поэтому они не будут отправлены в систему. SaveData действие.

Вам нужно будет добавить скрытый вход в ваш файл SaveData форма, и использовать JavaScript, чтобы скопировать значение из видимого входа, когда форма отправлена.

@using (Html.BeginForm("SaveData", "Access", FormMethod.Post, new { id = "saveForm" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" name="SearchId" id="SaveData_SearchId" />
    
    ...
    
    <input type="submit" value="Save" class="btn btn-default" />
}

@section Scripts {
    <script>
    $("#saveForm").submit(function(){
        $("#SaveData_SearchId").val($("#SearchId").val());
    });
    </script>
}


Khloud Ali

да, это сработало, но только для части SearchId, но как насчет модели? модель представления содержит отделы и разрешения. Все они возвращаются в функцию post как нули.Что я делаю не так?

Richard Deeming

Вы не можете использовать a foreach цикл для привязки к списку моделей; вы должны использовать for петля. Например:

<ul>
@if (Model.UserDepartments != null)
{
    for (int index = 0; index < Model.UserDepartments.Count; index++)
    {
        <li>
            @Html.CheckBoxFor(m => m.UserDepartments[index].IsChecked)
            @Html.DisplayFor(m => m.UserDepartments[index].DepName)
            @Html.HiddenFor(m => m.UserDepartments[index].DepId)
        </li>
    }
}
</ul>