ASP.NET Web Forms 4.5模型绑定模型包含集合的位置

Pau*_*ulD 15 asp.net webforms model-binding

我正在尝试更新旧的Web窗体应用程序以使用4.5中添加的新模型绑定功能,类似于MVC绑定功能.

我无法制作一个可编辑的FormView,它提供了一个包含简单成员的单个模型以及一个包含其他模型集合的成员.我需要用户能够编辑父对象的简单属性和子集合的属性.

问题是ProductChoice.Extras当代码尝试更新模型时,子collection()在模型绑定后始终为null.

这是我的模特:

[Serializable]
public class ProductChoice
{
    public ProductChoice()
    {
        Extras = new List<ProductChoiceExtra>();
    }

    public int Quantity { get; set; }
    public int ProductId { get; set; }
    public List<ProductChoiceExtra> Extras { get; set; }
}

[Serializable]
public class ProductChoiceExtra
{
    public int ExtraProductId { get; set; }
    public string ExtraName { get; set; }
    public int ExtraQuantity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的用户控制代码背后:

public partial class ProductDetails : System.Web.UI.UserControl
{
    private Models.ProductChoice _productChoice;

    protected void Page_Load(object sender, EventArgs e)
    {
        _productChoice = new Models.ProductChoice()
        {
            Quantity = 1,
            ProductId = 1
        };
        _productChoice.Extras.Add(new Models.ProductChoiceExtra()
        {
            ExtraProductId = 101,
            ExtraName = "coke",
            ExtraQuantity = 1
        });
        _productChoice.Extras.Add(new Models.ProductChoiceExtra()
        {
            ExtraProductId = 104,
            ExtraName = "sprite",
            ExtraQuantity = 2
        });

    }

    public Models.ProductChoice GetProduct()
    {
        return _productChoice;
    }

    public void UpdateProduct(Models.ProductChoice model)
    {
        /* model.Extras is always null here, it should contain two ProductChoiceExtra objects */

        if (TryUpdateModel(_productChoice) == true)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的控制标记:

<div id="selectOptions">
    <asp:FormView runat="server" ID="fvProductSelection" DefaultMode="Edit"
        ItemType="Models.ProductChoice"
        SelectMethod="GetProduct"
        UpdateMethod="UpdateProduct" >

        <EditItemTemplate>
            <asp:linkbutton id="UpdateButton" text="Update" commandname="Update" runat="server"/>
            <asp:HiddenField runat="server" ID="ProductId" Value="<%# BindItem.ProductId %>" />
            <asp:TextBox Text ="<%# BindItem.Quantity %>" ID="Quantity" runat="server" />

            <asp:Repeater ID="Extras" ItemType="Models.ProductChoiceExtra" DataSource="<%# BindItem.Extras %>" runat="server">
                <ItemTemplate>
                    <asp:HiddenField Value="<%# BindItem.ExtraProductId %>" ID="ExtraProductId" runat="server"  />
                    <asp:Label Text="<%# BindItem.ExtraName %>" ID="Name" runat="server" />
                    <asp:TextBox Text="<%# BindItem.ExtraQuantity %>" ID="Quantity"  runat="server" />
                </ItemTemplate>
            </asp:Repeater>
        </EditItemTemplate>
    </asp:FormView>
</div>
Run Code Online (Sandbox Code Playgroud)

我已经尝试过将Extras属性设为一个BindingList而不是一个List但是没有任何区别,该Extras集合不受该UpdateProduct方法的约束.

小智 -2

在查询字符串中传递额外值,在更新方法中添加参数值。使用 HTML 5 上的数据属性将这 3 个值存储在表单视图元素中

例子

UpdateMethod="UpdateProduct/104/coke/2"
Run Code Online (Sandbox Code Playgroud)

或者

UpdateMethod="UpdateProduct/?ExtraProductId=104&ExtraName=coke&ExtraQuantity=2"
Run Code Online (Sandbox Code Playgroud)

对于第一种方法,您必须在路由配置中编写路由规则。

在用户控件内部如下所示

public void UpdateProduct(Models.ProductChoice model, int ExtraProductId, string ExtraName, int ExtraQuantity)
{
    /* model.Extras is always null here, it should contain two ProductChoiceExtra objects */

    if (TryUpdateModel(_productChoice) == true)
    {
      model.Extras.Add(new Models.ProductChoiceExtra()
      {
        ExtraProductId = ExtraProductId,
        ExtraName = ExtraName,
        ExtraQuantity = ExtraQuantity
      });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 根据他的问题,我不明白这对于未知长度的集合如何工作?请注意他描述问题的代码注释:“它应该包含两个 ProductChoiceExtra 对象”。 (3认同)