在ASP.NET MVC 5中使用GET方法绑定表单复选框中的参数

时间:2014-09-28 23:22:27

标签: c# asp.net-mvc asp.net-mvc-5

我有一个来自下面的

<form action="/" method="get">
    <input type="radio" name="sort" value="date-desc" checked>
    <input type="radio" name="sort" value="price-desc">
    <input type="radio" name="sort" value="price-asc">
    <input type="radio" name="sort" value="like-desc">
    <input type="radio" name="sort" value="like-asc">
    <input type="checkbox" name="show-discount">
    <input type="checkbox" name="show-new">
    <input type="submit" class="btn btn-default" value="Search">
</form>

它返回的网址如下:<site>?sort=date-desc&show-discount=on&show-new=on

我想将它绑定到控制器动作,动作如下:

public ActionResult Index([Bind(Prefix = "sort")]string Sort, 
    [Bind(Prefix = "show-discount")]bool? ShowDiscount = null, 
    [Bind(Prefix = "show-new")]bool? ShowNew = null)
{

}

问题是ShowDiscountShowNew参数始终为空(没有正确绑定)。

我认为复选框在选中时会导致问题写为cb-name=on而不是cb-name=true。并且当未选中复选框时,它不会写在网址上。

有没有正确的方法呢?

有没有办法将Sort参数映射到枚举?

2 个答案:

答案 0 :(得分:1)

使用视图模型

模型

public class MyModel
{
  public string sort { get; set; }
  public bool show-discount { get; set; }
  public bool show-discount { get; set; } // or bool? if you want it to be nullable
  public bool show-new { get; set; }
}

控制器

public ActionResult Edit()
{
  MyModel model = new MyModel();
  model.date-desc = "date-desc"; // set default
  return View(model)
}

public ActionResult Edit(MyModel model)
{
  .... // model is correctly bound with selected values

查看

@model MyModel
@using (Html.BeginForm())
{
  .....
  @Html.RadioButtonFor(m => m.sort, "date-desc", new { id = "date-desc" });
  @Html.RadioButtonFor(m => m.sort, "price-desc", new { id = "price-desc" });
  @Html.RadioButtonFor(m => m.sort, "price-asc", new { id = "price-asc" });
  @Html.RadioButtonFor(m => m.sort, "like-desc", new { id = "like-desc" });
  @Html.RadioButtonFor(m => m.sort, "like-asc", new { id = "like-asc" });
  @Html.CheckBoxFor(m => m.show-discount);
  @Html.CheckBoxFor(m => m.show-new);
  <input type="submit" class="btn btn-default" value="Search">
}

请注意,您可以制作sort和枚举。如果bool值可以为空,CheckBoxFor将呈现一个包含3个值的下拉列表(以允许选择null)

请注意,在您的代码中,您不需要[Bind(Prefix..。您可以使用<input type="checkbox" name="show-discount" value="true">但这只适用于非可空布尔值,因为未选中的复选框不会回发。如果不加以检查,您将获得null,而非false

修改

如果您想使用枚举

public enum MyEnum
{
  date-desc,
  price-desc,
  ....
}

public class MyModel
{
  public MyEnum sort { get; set; }
  ....

查看(包括用于定义枚举的程序集的@using)

@Html.RadioButtonFor(m => m.sort, MyEnum.date-desc, new { id = "date-desc" });
@Html.RadioButtonFor(m => m.sort, MyEnum.price-desc, new { id = "date-desc" });
....

答案 1 :(得分:0)

创建一个ViewModel,其中包含与您的表单输入匹配的属性。

public class ViewModel 
{
    public bool ShowDiscount { get; set; }
    // add additional properties
}

然后,在form上的view,添加@Html.CheckBoxFor(m => m.ShowDiscount)

<form action="/" method="get">
    @Html.CheckBoxFor(m => m.ShowDiscount)
    <input type="submit" class="btn btn-default" value="Search">
</form>

请务必让view知道应该期待哪种类型的model。在view指定的顶部。

@model YourNamespace.ViewModel

您的controller方法现在看起来像这样:

public ActionResult Index(ViewModel v)
{
    // do work here.
}

框架将为您进行绑定。