我有一个来自下面的
<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)
{
}
问题是ShowDiscount
和ShowNew
参数始终为空(没有正确绑定)。
我认为复选框在选中时会导致问题写为cb-name=on
而不是cb-name=true
。并且当未选中复选框时,它不会写在网址上。
有没有正确的方法呢?
有没有办法将Sort
参数映射到枚举?
答案 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.
}
框架将为您进行绑定。