【问题标题】:How Post the list of items from PartialView to controller?如何将项目列表从部分视图发布到控制器?
【发布时间】:2016-05-05 05:20:05
【问题描述】:

这实际上是很简单的情况,但我不知道如何使它工作。因此,PartialView 中呈现了复选框列表。数据从父 ViewModel 传递到 PartialView 中的子 ViewModel。所有这些都被表单包裹着,很遗憾我无法从 PartialView 获取数据。
父视图模型:

public class UserProgramsViewModel
    {
        public int Id { get; set; }
        [Required(ErrorMessage = "Введите название")]
        [DisplayName("Название")]
        public string ProgramName { get; set; }
        [DisplayName("Пользователь")]
        public string UserName { get; set; }
        [DisplayName("Пользователь")]
        public int UserId { get; set; }
        [DisplayName("Дни Программы")]
        public ICollection<ProgramDaysDTO> ProgramDays { get; set; }
        public IEnumerable<DaysViewModel> Days { get;  set;} //Passed to Partial
    }

子视图模型:

public class DaysViewModel
    {
        public int Id { get; set; }
        public string DayName { get; set; }
    }

父视图:

@Html.Partial("Days", Model.Days)

PartialView(这里我们使用属性名称“Days”将其绑定到父模型)

@model IEnumerable<BBN.Admin.ViewModels.DaysViewModel>
<ul class="list-group col-lg-2">
    @foreach (var item in Model)
    {
        <li class="list-group-item"><input type="checkbox" name="Days" value="@item.Id" /> @item.DayName</li>
    }
</ul>

控制器:

        [HttpPost]
        [RBAC]
        public async Task<ActionResult> Create(UserProgramsViewModel model)
        {
            var groups = await _us.GetAll();
            ViewBag.Users = groups.Select(x => new SelectListItem
            {
                Text = x.Login,
                Value = x.Id.ToString()
            });
            var dto = new UserProgramsDTO
            {
                ProgramName = model.ProgramName,
                UserId = model.UserId,
                Days = model.Days
            };
            var result = await _ps.Create(dto);
            if (result.IsSuccess == (BLL.Utilities.Enums.IsSuccess)Enums.IsSuccess.Success) return RedirectToAction("Index");
            else return View("Create");
        }

【问题讨论】:

  • Days 是一个复杂对象,您不能将复选框绑定到复杂对象。也不能使用foreach 循环为集合生成表单控件。您需要一个视图模型和一个类似于this answerfor 循环
  • 伙计们,感谢您的想法,让我尝试一些解决方案。

标签: c# asp.net-mvc


【解决方案1】:

您可以使用FormCollection。将item.DayName 分配给输入的名称属性:

部分视图(片段):

<li class="list-group-item">
      <input type="checkbox" name="@(item.DayName)Days" @if (item.Id > 0) { <text>checked</text> } /> @item.DayName
</li>

然后处理FormCollection参数并在它的帮助下填充模型的Days属性:

控制器:

[HttpPost]
[RBAC]
public async Task<ActionResult> Create(UserProgramsViewModel model, FormCollection formCollection)
{
    model.Days = new List<DaysViewModel>();
    foreach(var key in formCollection.AllKeys.Where(x => x.Contains("Days")))
        model.Days.Add(new DaysViewModel { Id = formCollection[key] == "on" ? 1 : 0, DayName = key.Replace("Days", "")} );

     //other stuff...
}

【讨论】:

    【解决方案2】:

    您是否在控制器的父视图中设置了“天数”的值? 比如假设你的父视图名称是“Parent”,那么你应该这样写,

    public ActionResult Parent()
    {
         UserProgramsViewModel loUser = new UserProgramsViewModel(); 
           //Assign Your values here
    
         View(loUser); 
    }
    

    所以你可能不会在这里得到 Null 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 2016-09-10
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多