产品检查清单

时间:2011-10-24 21:07:59

标签: asp.net-mvc

更新!我刚注意到,由于某些未知原因,每个复选框后都有一个隐藏字段,其名称始终默认设置为false。我没有把隐藏的字段放在他们之后?这是萤火虫和值=“真实”,不知道为什么它说,因为它甚至没有检查。

<div style="display: inline;">
<input id="IsSmall" type="checkbox" value="true" name="IsSmall">
<input type="hidden" value="false" name="IsSmall">
S
</div>

这是UI:产品列表,每个列表旁边都有一个复选框,用于指示客户是选择了小型,中型还是大型。

我正在使用vs2008,mvc 1.0,jquery,sqlserver 2005

在View中如何获取复选框值以回发到服务器?有趣的是产品名称的帖子很好吗?

模型

namespace PostingListItems.ViewModels
{
    public struct Product
    {
        public string Name { get; set; }
        public string Sizes { get; set; }
        public bool HasSmall
        {
            get
            {
                return Sizes.IndexOf("S") != -1;
            }
        }
        public bool IsSmall { get; set; }
        public bool HasMedium
        {
            get
            {
                return Sizes.IndexOf("M") != -1;
            }
        }
        public bool IsMedium { get; set; }
        public bool HasLarge
        {
            get
            {
                return Sizes.IndexOf("L") != -1;
            }
        }
        public bool IsLarge { get; set; }
    }

    public class ProductViewModel
    {
        public int OrderId { get; set; }
        public List<Product> Products { get; set; }

        public ProductViewModel()
        {
            Products = new List<Product>();
            Products.Add(new Product() { Name = "Widget1", Sizes = "S,M,L" });
            Products.Add(new Product() { Name = "Widget2", Sizes = "S,M" });
        }
    }
}

查看

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Index</h2>
    <% using (Html.BeginForm())
       { %>

       <% foreach (var item in Model.Products)
          { %>
          <% var index = Model.Products.IndexOf(item); %>
             <label for="Name"><%= item.Name %></label>            
             <div style="display: <%= item.HasSmall?"inline":"none" %>;"><%=Html.CheckBox("IsSmall")%>S</div>
             <div style="display: <%= item.HasMedium?"inline":"none" %>;"><%=Html.CheckBox("IsMedium")%>M</div>
             <div style="display: <%= item.HasLarge?"inline":"none" %>;"><%=Html.CheckBox("IsLarge")%>L</div>
             <br /> 
         <% } %>
    <input id="Submit1" type="submit" value="submit" />
    <% } %>
</asp:Content

&GT;

控制器

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        ProductViewModel model = new ProductViewModel();


        return View(model);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(ProductViewModel model)
    {
        return View(model);
    }

    public ActionResult About()
    {
        return View();
    }
}

2 个答案:

答案 0 :(得分:1)

我会使用编辑器模板来生成表单,如下所示:

<% using (Html.BeginForm()) { %>
    <%= Html.EditorFor(x => x.Products) %>
    <input id="Submit1" type="submit" value="submit" />
<% } %>

然后在相应的编辑器模板中,它将自动为Products集合的每个元素(~/Views/Shared/EditorTemplates/Product.ascx)呈现:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.Product>" %>
<%= Html.LabelFor(x => x.Name) %>
<%= Html.EditorFor(x => x.Name) %>

<div style="display: <%= Model.HasSmall?"inline":"none" %>;">
    <%= Html.CheckBoxFor(x => x.IsSmall) %>S
</div>

<div style="display: <%= Model.HasMedium?"inline":"none" %>;">
    <%= Html.CheckBoxFor(x => x.IsMedium)%>M
</div>

<div style="display: <%= Model.HasLarge?"inline":"none" %>;">
    <%= Html.CheckBoxFor(x => x.IsLarge)%>L
</div>
<br /> 

您的代码无效的原因是因为生成的复选框输入没有正确的名称,因此默认模型绑定器可以成功读取其值。我建议你阅读following blog post以更好地理解所需的电线格式。但在应用程序中,强烈建议始终使用editor/display templates,因为它们将处理所有这些约定。

答案 1 :(得分:0)

MVC使用两个字段,输入类型复选框和隐藏输入呈现checkbox,因为如果未选中该复选框,则浏览器不会提交值。在您的代码中,您在所有产品的复选框字段中使用相同的id,因此您可以折叠创建视图模型所需的信息。