【问题标题】:Binding difficulty upon postback of list列表回发时的绑定难度
【发布时间】:2011-02-04 06:39:33
【问题描述】:

我很难回发正在输入的新数据。尽管在提交之前对数据进行了更改,但发送到视图的数据似乎被发送回控制器。

我的代码如下:

控制器 公共类 GroupRateController : 控制器 { // // GET: /GroupRate/

    public ActionResult Index()
    {
        GroupRateModel model = new GroupRateModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(GroupRateModel model)
    {
        model.Save(model);
        return View(model);
    }

}

查看

 @model MvcApplication1.Models.GroupRateModel

@{
    View.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>
@using (Html.BeginForm())
{

@Html.ValidationSummary()

<table>
<thead>

</thead>
<tr><th>Rate Group</th><th>Default Amount</th><th>Client Amount</th></tr>
@foreach (var item in @Model.ClientRateDetails)
{
<tr><td>@item.RateGroupName</td><td align="right">@Html.DisplayFor(m => @item.RateGroupID)</td><td>@Html.EditorFor(model => item.ClientRate)</td></tr>

}
</table>

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

型号

    using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    public class GroupRateModel 
    {
        public List<ClientRateDetailsModel> ClientRateDetails = new List<ClientRateDetailsModel>() ;
        public string Name { get; set; }


        public GroupRateModel()
        {
                    ClientRateDetails.Add(new ClientRateDetailsModel
                    {
                        RateGroupID = 1,
                        RateGroupName = "Test1",
                        ClientRate = 100
                    });

                    ClientRateDetails.Add(new ClientRateDetailsModel
                    {
                        RateGroupID = 2,
                        RateGroupName = "Test2",
                        ClientRate = 200
                    });

                    ClientRateDetails.Add(new ClientRateDetailsModel
                    {
                        RateGroupID = 3,
                        RateGroupName = "Test3",
                        ClientRate = 300
                    });

        }

        public void Save(GroupRateModel model)
        {
             foreach (var item in model.ClientRateDetails)
                {
                    //...;
                }
            }
        }


    public class ClientRateDetailsModel
    {       
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:00.00}", NullDisplayText = "")]
        [Range(0, (double)decimal.MaxValue, ErrorMessage = "Please enter a valid rate")]
        public decimal? ClientRate { get; set; }
        public int? RateGroupID { get; set; }
        public string RateGroupName { get; set; }
    }

}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    这可能是因为您的输入控件的名称没有正确的名称,模型绑定器无法正确获取值。我还看到 ClientRateDetails 不是属性,而是模型中的一个字段,无法正确绑定。因此,我建议您改进代码的方法如下:

    从模型开始:

    public class GroupRateModel 
    {
        public IEnumerable<ClientRateDetailsModel> ClientRateDetails { get; set; }
        public string Name { get; set; }
    
        public GroupRateModel()
        {
            // Remark: You cannot assign your ClientRateDetails collection here
            // because the constructor will be called by the default model binder
            // in the POST action and it will erase all values that the user
            // might have entered
        }
    
        public void Save(GroupRateModel model)
        {
            foreach (var item in model.ClientRateDetails)
            {
                //...;
            }
        }
    }
    
    public class ClientRateDetailsModel
    {       
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:00.00}", NullDisplayText = "")]
        [Range(0, (double)decimal.MaxValue, ErrorMessage = "Please enter a valid rate")]
        public decimal? ClientRate { get; set; }
        public int? RateGroupID { get; set; }
        public string RateGroupName { get; set; }
    }
    

    然后是控制器:

    public class HomeController: Controller
    {
        public ActionResult Index()
        {
            var model = new GroupRateModel();
            model.ClientRateDetails = new[]
            {
                new ClientRateDetailsModel
                {
                    RateGroupID = 1,
                    RateGroupName = "Test1",
                    ClientRate = 100
                },
                new ClientRateDetailsModel
                {
                    RateGroupID = 2,
                    RateGroupName = "Test2",
                    ClientRate = 200
                },
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(GroupRateModel model)
        {
            model.Save(model);
            return View(model);    
        }
    }
    

    然后是对应的视图:

    @model MvcApplication1.Models.GroupRateModel
    @{
        View.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    <h2>Index</h2>
    @using (Html.BeginForm())
    {
        @Html.ValidationSummary()
        <table>
        <thead>
            <tr>
                <th>Rate Group</th>
                <th>Default Amount</th>
                <th>Client Amount</th>
            </tr>
        </thead>
        @Html.EditorFor(x => x.ClientRateDetails)
        </table>
        <p><input type ="submit"  value="Save" id="submit" /></p>
    }
    

    然后有对应的编辑器模板(~/Views/Home/EditorTemplates/ClientRateDetailsModel.cshtml):

    @model MvcApplication1.Models.ClientRateDetailsModel
    <tr>
        <!-- Make sure you include the ID as hidden field 
             if you want to get it back inside the POST action
        -->
        @Html.HiddenFor(x => x.RateGroupID)
        <td>@Model.RateGroupName</td>
        <td align="right">@Model.RateGroupID</td>
        <td>@Html.EditorFor(x => x.ClientRate)</td>
    </tr>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多