【问题标题】:ASP MVC3 view model losing data from collection objects on post back to edit methodASP MVC3 视图模型在回发到编辑方法时从集合对象中丢失数据
【发布时间】:2013-03-24 07:50:46
【问题描述】:

我的 ASP MVC3 视图模型在 Edit 方法加载这个特定页面时工作得很好,但是当用户点击保存并执行回发时,两个集合对象 (List<T>) 中包含的所有信息都丢失了。有任何想法吗?

这是视图中的代码。这会正确加载所有代理信息(ID 和状态代码)

    @for (int i = 0; i < Model.Fixed.Count; i++)
    {           

        if(!String.IsNullOrWhiteSpace(Model.Fixed[i].AgentId))
        {
           fixedRow++;

           if (fixedRow > 2)
           {
               var rowId = "row" + fixedRow.ToString() + "F";
               <tr id=rowId class="noSee">
                    <td>
                        @Html.DropDownListFor(model => model.Fixed[i].StateCode,
                         (SelectList)ViewBag.StateCodeList, Model.Fixed[i].StateCode)
                    </td>
                    <td>
                        @Html.EditorFor(model => model.Fixed[i].AgentId)
                        @Html.ValidationMessageFor(model => model.Fixed[i].AgentId)
                    </td>
                    @if(fixedRow > 1)
                    {
                        var send = "MoreFixed(" + (fixedRow + 1).ToString() + ");";
                        var dataId = "plus" + fixedRow.ToString() + "F;";
                        <td id=@dataId  class="more" onclick=@send>+</td>
                    }
               </tr> 
           }
           else
           {
                <tr>
                    <td>
                        @Html.DropDownListFor(model => model.Fixed[i].StateCode,
                         (SelectList)ViewBag.StateCodeList, Model.Fixed[i].StateCode)
                    </td>
                    <td>
                        @Html.EditorFor(model => model.Fixed[i].AgentId)
                        @Html.ValidationMessageFor(model => model.Fixed[i].AgentId)
                    </td>
                    @if(fixedRow > 1)
                    {
                        var send = "MoreFixed(" + (fixedRow + 1).ToString() + ");";
                        var id = "plus" + fixedRow.ToString() + "F;";
                        <td id=@id class="more" onclick=@send>+</td>
                    }

                </tr> 
           }        
        }
    }

这是来自视图模型的代码

public class BankListViewModel
{
    public int ID { get; set; }
    public string BankName { get; set; }
    public string Tier { get; set; }
    public string SpecialNotes { get; set; }
    public string WelcomLetterReq { get; set; }

    public List<BankListAgentId> Fixed { get; set; }
    public List<BankListAgentId> Variable { get; set; }
    public List<BankListAttachments> Attachments { get; set; }

    public BankListViewModel()
    {
        //Initialize Fixed and Variable stat Lists
        Fixed = new List<BankListAgentId>();
        Variable = new List<BankListAgentId>();

        Models.BankListAgentId agentId = new BankListAgentId();

        for (int i = 0; i < 5; i++)
        {
            Fixed.Add(agentId);
            Variable.Add(agentId);                
        }

        //Initialize attachment Lists
        Attachments = new List<BankListAttachments>();
        Attachments.Add(new BankListAttachments());
    }
}

这是接收回发的控制器方法。同样,当页面加载时, GET Edit 方法从数据库中收集所有正确的信息,并将视图模型正确地返回给视图。

    [HttpPost]
    public ActionResult Edit(BankListViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            List<BankListAgentId> agentId = new List<BankListAgentId>();
            List<BankListAttachments> attachments = new List<BankListAttachments>();
            BankListMaster master = new BankListMaster();

            master = decipherViewModel(viewModel, out agentId, out attachments);

            db.Entry(master).State = EntityState.Modified;
            db.SaveChanges();


            return RedirectToAction("Index");
        }
        ViewBag.ID = new SelectList(db.BankListAgentId, "ID", "FixedOrVariable", viewModel.ID);
        return View(viewModel);
    } 

    private BankListMaster decipherViewModel(BankListViewModel viewModel, out List<BankListAgentId> agentId, out List<BankListAttachments> attachments)    
    {
        //Initialize
        BankListMaster banklistmaster = new BankListMaster();
        agentId = new List<BankListAgentId>();
        attachments = new List<BankListAttachments>();

        viewModel.BankName = banklistmaster.BankName;
        viewModel.SpecialNotes = banklistmaster.SpecialNotes;
        viewModel.Tier = banklistmaster.Tier;

        foreach (var item in viewModel.Fixed)
        {
            item.ID = viewModel.ID;
            agentId.Add(item);
        }

        foreach (var item in viewModel.Variable)
        {
            item.ID = viewModel.ID;
            agentId.Add(item); 
        }

        foreach (var item in viewModel.Attachments)
        {
            item.ID = viewModel.ID;
            attachments.Add(item);
        }

        return banklistmaster;
    }

【问题讨论】:

  • 我看不到您试图在哪里读取这些集合的值。
  • 哎呀,抱歉。已编辑

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 postback viewmodel


【解决方案1】:

唯一返回到控制器的是 Html 表单字段字段。而已。如果您不将信息放在表单字段(输入、选择、文本区域等)中,则不会回发。

如果您希望回发该数据,则必须将其放置在隐藏字段中。在回发时简单地在数据库中查找该数据可能更容易。

【讨论】:

    【解决方案2】:

    这些值不会被提交回控制器。提交的是您在视图中使用集合中的值创建的下拉列表中的选择,假设下拉列表位于您重新提交的表单中。

    【讨论】:

    • Fixed[i].AgentId/StateCode 均缺失。所有价值,而不仅仅是下拉项目中的价值,都消失了。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多