列表回发时的绑定难度

时间:2011-02-04 06:39:33

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

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

我的代码如下:

控制器      public class GroupRateController:Controller     {         //         // 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; }
    }

}

1 个答案:

答案 0 :(得分:5)

这可能是因为输入控件的名称没有正确的名称,因为模型绑定器无法正确获取值。此外,我发现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>