更新!我刚注意到,由于某些未知原因,每个复选框后都有一个隐藏字段,其名称始终默认设置为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();
}
}
答案 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
,因此您可以折叠创建视图模型所需的信息。