【问题标题】:ViewModel collection property lost values after posting back to controller action in MVC 3在 MVC 3 中回发到控制器操作后,ViewModel 集合属性丢失了值
【发布时间】:2012-03-27 15:32:33
【问题描述】:

我有我的视图模型:

public class POReceiptViewModel
{
    public virtual int PONumber { get; set; }
    public virtual string VendorCode { get; set; }

    public virtual IList<POReceiptItemViewModel> POReceiptItems { get; set; }

    public POReceiptViewModel()        
    {
        POReceiptItems = new List<POReceiptItemViewModel>();
    }
}

public class POReceiptItemViewModel
{
    public virtual string ItemCode { get; set; }
    public virtual string ItemDesription { get; set; }
    public virtual decimal OrderedQuantity { get; set; }
    public virtual decimal ReceivedQuantity { get; set; }
    public virtual DateTime ReceivedDate { get; set; }

    public POReceiptItemViewModel()
    {
        ReceivedDate = DateTime.Now;
    }
}

然后我的控制器有两个动作,一个get和一个post:

public ActionResult CreatePOReceipt(int poNumber)
{
    PurchaseOrder po = PurchasingService.GetPurchaseOrder(poNumber);
    POReceiptViewModel poReceiptViewModel = ModelBuilder.POToPOReceiptViewModel(po);
    return View("CreatePOReceipt", poReceiptViewModel);
}

[HttpPost]
public ActionResult CreatePOReceipt(POReceiptViewModel poReceiptViewModel)
{
    // Here the problem goes. The items in the poReceiptViewModel.POReceiptItems has lost. the count became zero.
    return View("Index");
}

在我的视图中,我可以正确显示模型,并且通过使用 @Html.HiddenFor 我可以根据需要保留视图模型数据。但不在 List 导航属性上。

@model POReceiptViewModel

@using (Html.BeginForm())
{   
    <fieldset>
        <legend>Purchase Order</legend>
        <label>For PO # :</label>
        @Html.HiddenFor(m => m.PONumber)    
        @Html.DisplayTextFor(m => m.PONumber)
        <label>Vendor Code :</label>
        @Html.HiddenFor(m => m.VendorCode)  
        @Html.DisplayTextFor(m => m.VendorCode)
    </fieldset>

    <fieldset>
        <legend>Received Items</legend>

        <table class="tbl" id="tbl">
           <thead>
           <tr>
           <th>Item Code</th><th>Item Description</th><th>OrderedQuantity</th><th>Received Quantity</th><th>Received Date</th>
           </tr>
           </thead>
           <tbody>
           @Html.HiddenFor(m => m.POReceiptItems) // I'm not really sure if this is valid
           @if (Model.POReceiptItems.Count > 0)
            {
                foreach (var item in Model.POReceiptItems)
                {       
                    <tr>
                        <td>@Html.DisplayTextFor(i => item.ItemCode)</td>@Html.HiddenFor(i => item.ItemCode)    
                        <td>@Html.DisplayTextFor(i => item.ItemDesription)</td>@Html.HiddenFor(i => item.ItemDesription)    
                        <td>@Html.DisplayTextFor(i => item.OrderedQuantity)</td>@Html.HiddenFor(i => item.OrderedQuantity)  
                        <td>@Html.TextBoxFor(i => item.ReceivedQuantity)</td>
                        <td>@Html.TextBoxFor(i => item.ReceivedDate)</td>
                    </tr>
                }
            }
           </tbody>
        </table>
    </fieldset>
    <input type="submit" name="Received" value="Received" />
}

问题: 提交表单时,POReceiptItems 丢失。我尽可能不想使用 TempData["POReceiptItems"] = Model.POReceiptItems 但即使我使用它,输入 ReceivedQuantity 和 ReceivedDate 的值也不会保存到 TempData。

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    您丢失了列表,因为 MVC 没有按照您的想法处理列表。

    你应该使用BeginCollectionItem看看this post

    【讨论】:

      【解决方案2】:

      试试

      @for (int i = 0; i < Model.POReceiptItems.Count(); i++)
      { 
      <tr>
        <td>@Html.DisplayTextFor(m => m.POReceiptItems[i].ItemCode)</td>@Html.HiddenFor(m => m.POReceiptItems[i].ItemCode)    
        <td>@Html.DisplayTextFor(m => m.POReceiptItems[i].ItemDesription)</td>@Html.HiddenFor(m => m.POReceiptItems.ItemDesription)                                                               <td>@Html.DisplayTextFor(m => m.POReceiptItems[i].OrderedQuantity)</td>@Html.HiddenFor(m => m.POReceiptItems[i].OrderedQuantity)  
        <td>@Html.TextBoxFor(m => m.POReceiptItems[i].ReceivedQuantity)</td>
        <td>@Html.TextBoxFor(m => m.POReceiptItems[i].ReceivedDate)</td>
      </tr>
      }
      

      还可以阅读 blog post 以了解模型绑定到列表的工作原理

      【讨论】:

      • 完美!提供解决方案然后提供额外的阅读非常棒!它现在按我预期的方式工作。我必须阅读该博客以进一步了解它,因为我是 mvc 新手。仅供参考,这是我在 stackoverflow 中的第一篇文章,几分钟后我得到了答案。
      【解决方案3】:

      我有一个类似的问题,“列表”属性返回没有值(计数 = 0),我尝试了不同的方法和答案,但都没有。 然后我自己尝试了,现在它正在工作,这是我的解决方案:

      我发送了一个带有一些普通属性和一个“列表”的对象,之后我在 For 中使用了普通属性和我的“列表”。 在我的控制器(Post ActionResult)中,在参数部分我添加了两个参数,我的原始对象和我的“列表”作为第二个参数,它可以工作!!! 我希望这对您和其他有类似问题的人有所帮助。

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多