Html.DropDownList自动添加前缀

时间:2011-08-11 13:36:24

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

我有以下部分视图BuyProduct.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMusicStore.Models.Product>" %>

<span class="price">Precio: <em><strong><%: Html.Price(Model) %></strong></em></span>

<div class="wrapper">
<% if (Model.Active) { %>
    <% using (Html.BeginForm("AddToCart", "ShoppingCart", new { id = Model.ProductId }, FormMethod.Post, new { id = "addtocart-form" })) {%>

            <% if (Model.MetricType == (int)ProductMetricType.Units) { %>
                <%: Html.DropDownList("Quantity" , new SelectList(DropDownLists.Units , "Value", "Key" , Model.MetricType)) %>
            <% } else { %>
                <%: Html.DropDownList("Quantity", new SelectList(DropDownLists.Kilograms, "Value", "Key", Model.MetricType)) %>
            <% } %>

        <input type="submit" value="Comprar" />
    <% } %>
<% } else { %>
    <span class ="buttonBig">Sin existencias!</span>
<% } %>
</div>

如果我在View中使用它,则下拉列表名称保持不变,但如果我在EditorTemplate中使用它,例如:

<%@ Import Namespace="MvcMusicStore"%>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcMusicStore.Models.Product>" %>
<li>
    <h3><%: Html.Truncate(Model.Name, 25) %></h3>
    <p><a href="<%: Url.Action("Details", "Store",  new { id = Model.ProductId }) %>"><img alt="<%: Model.Name %>" src="<%: Model.ProductArtUrl %>" width="180" height="165" /></a></p>
    <% Html.RenderPartial("BuyProduct", Model); %>
</li>

我的控制器代码:

    public ActionResult AddToCart(Guid id, int quantity = 1) {

带有模型类名称的前缀正被添加到DropDownList名称( Product.Quantity 插入数量),我的操作不再获得正确的值,关于如何解决这两种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

在DropDownList扩展中,SelectInternal方法包含下面的构造,用于生成唯一名称。

string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

我想这是因为你正在使用模板,包含的模型名称“Product”与成员名称“Quantity”一起呈现。可能在使用多个模板时避免名称冲突。

如果你真的想“覆盖”这种行为,DropDownList扩展的自定义实现可能是你最好的选择。