c# - 如何在 MVC 中绑定(bind)列表属性?

标签 c# asp.net-mvc

我有一个创建/更新 Irrf View :

 @using (Html.BeginForm("Update", "ParamsController", FormMethod.Post))
 {
        <div class="row">
            @Html.DropDownList("Year", Model.Years.Select(p => new SelectListItem { Value = p.ToString(), Text = p.ToString() }), new { @class = "form-control", name = "Ano", id = "AnosDropDown" })
            @Html.ValidationMessageFor(n => n.Years)
         </div>
         <hr/>

           <div id="irrContent">
                @Html.Partial("_Irrf", Model.List.ToList())
           </div>

          <button class="col-xs-12 btn btn-success" data-enviaform>Save</button>                   
    }

ParamsController 中:

    public ActionResult Irrf(int? year)
    {
        if (!year.HasValue)
            year= DateTime.Now.Year;

        var model = new IrrfViewModel
        {
            IrrfList = _service.Get(year.Value),
            Years = _service.GetYears(),
            Year = year.Value
        };

        if(Request.IsAjaxRequest())
            return PartialView("_Irrf", model.IrrfList.ToList());

        return View(model);
    }

在 _Irrf PartialView 中:

@model  List<Application.IrrfDTO>

 @for (var i = 0; i < Model.Count(); i++)
 { 
     <div class="mb20 col-xs-12 col-sm-4">
        @Html.TextBoxFor(n => Model[i].FinalValue, new { @class = "form-contro" })
    </div>

 }

在后期操作中:

 public ActionResult Update(IrrfViewModel model)
 {
     //Code

 }

IrrfViewModel:

 public class IrrfViewModel
 {
    public IEnumerable<IrrfDTO> IrrfList { get; set; }
    public IEnumerable<int> Years { get; set; }
    public int Year { get; set; }
 }

我不知道如何将 IrrfList 属性绑定(bind)到 IrrfViewModel 中。

有什么建议吗?

最佳答案

您应该使用编辑器模板

~/Views/Home/ 中创建一个名为 IrrfDTO.cshtml 的新 Razor View (假设您的 GET 操作方法在 HomeController 中。根据您的要求更改位置。 enter image description here

在这个新 View 中,有这段代码

@model ReplaceWithYourNameSpaceHere.IrrfDTO
<div>
    @Html.TextBoxFor(s=>s.FinalValue)
</div>

现在在您的主视图中,只需使用 Html.EditorFor 辅助方法即可。

@model IrrfViewModel
@using(Html.BeginForm())
{
 <!-- Your other form controls goes here -->
    <div id="irrContent">
         @Html.EditorFor(s => s.IrrfList)
    </div>
    <button class="col-xs-12 btn btn-success" data-enviaform>Save</button>
}

编辑器模板将为 IrrfList 属性中的每个项目生成正确的输入名称(例如:IrrfList[0].FinalValue ,IrrfList[1].FinalValue )

由于输入属性名称很好,Modelbinder 将能够将发布的表单值映射到您的 HttpPost 操作中的 IrrfViewModel 对象。

[HttpPost]
public ActionResult Update(IrrfViewModel model)
{
  // check model.IrrfList property.
  // to do : Return something
}

关于c# - 如何在 MVC 中绑定(bind)列表属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36651508/

相关文章:

c# - 如何处理纯粹与 View 相关的命令?

c# - 在 Parallel for 中使用 ConcurrentBag 与简单数组

c# - Owin 声明 - 添加多个 ClaimTypes.Role

jquery - 将数组从 Controller 传递到 Web 服务

asp.net-mvc - 返回一个 View 模型类型与传递的不同的 mvc 操作

asp.net - ASP.NET webforms 和 MVC 之间的主要区别是什么

c# - ExecuteReader(CommandBehavior.CloseConnection) 会始终关闭连接吗?

c# - 为什么子类需要实现父接口(interface)来隐藏 C# 中的父方法之一?

c# - 组织 c# 项目帮助程序或实用程序类

c# - ASP.NET MVC 处理区域中的请求验证异常