【问题标题】:MVC3 WebGrid CheckBoxMVC3 WebGrid 复选框
【发布时间】:2012-05-05 03:36:47
【问题描述】:

我正在尝试向网络网格上的列添加一个复选框,但我发现使用 Html.CheckBox 来渲染它很难。如果我使用 input type="checkbox" 它会呈现,但我似乎无法将值保存在视图模型中。

我有一个相当复杂的视图,它有两个 webGrid,您可以在一个中选择项目以移动到另一个,当移动到 grid1 时,您可以根据需要在每一行上选中一个框。一切正常,除了我无法保存复选框的值。

带有复选框的网格的代码如下所示:

var grid1 = new WebGrid(source: Model.FieldsInTemplate, canSort: false, defaultSort:"FieldName");

    @grid1.GetHtml(headerStyle:"gridGroupRow", tableStyle: "gridGroup", rowStyle: "gridRow", alternatingRowStyle: "gridRowAlt", columns: grid1.Columns(
        grid1.Column("FieldName", "Field Name"),
        grid1.Column(header: "Required", format: @<text><input name="IsRequired" type="checkbox" value="@item.IsRequired" /></text>),
        grid1.Column(format: (item) => new HtmlString("<a href='#' id='test' onclick='updateTemplate(false," + item.FieldId.ToString() + ");'>Remove</a>"))
             ))

因此,使用上述方法,网格会呈现一个复选框,但在提交时实体始终为 false。该视图使用的 viewModel 为:

public class TemplateFieldInteractViewModel
{
    public IList<MetadataTemplateFieldInstanceDisplayViewModel> FieldsInTemplate
    {
        get;
        set;
    }

    public IList<MetadataTemplateFieldInstanceDisplayViewModel> FieldsNotInTemplate
    {
        get;
        set;
    }
}

MetadataTemplateFieldInstanceDisplayViewModel 看起来像:

public class MetadataTemplateFieldInstanceDisplayViewModel
{
    public int FieldId {get;set;}

    public string FieldName {get;set;}

    public bool IsRequired {get;set;}
}

如果这有点含糊,请告诉我,我是新来的,不想用太多不必要的代码让你超载。

干杯

标记

【问题讨论】:

  • 我没有使用过WebGrid,但怀疑它可能与Html.CheckboxFor 一样,它会生成一个始终设置为false 的额外隐藏字段。这可能是导致问题的原因 - 请参阅stackoverflow.com/questions/2697299/…

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


【解决方案1】:

复选框的值并不能确定它是否被“选中”。你需要使用checked="checked"。

我不是 100% 学过 Razor,但这里有一个尝试:

<input name="IsRequired" type="checkbox" @if(item.IsRequired) { <text>checked="checked"</text>} value="@item.IsRequired" /> 

这能解决您的问题吗?

【讨论】:

  • 很遗憾,这并没有解决问题。感谢您的尝试。这看起来像是在说“如果选中了 IsRequired,则选中该框”。最初加载网格时,此字段始终为 false,因此用户将在需要时对其进行检查。
  • 嗯,我一直对对象的“列表”感到困惑。帖子是什么样的?
  • 好的,如果行已经选中了复选框,那么它可以工作(在运行时显示已选中的字段),进入更新视图。但是,在提交时,以前检查过的字段(即使在运行时没有更改它们)现在将被取消选中。
  • 这有点令人困惑。它不进入控制器吗?同样,表单的 POST 请求是什么样的?我不需要 RAW 视图,只需要数据元素。
  • 嘿,感谢您的意见,我实际上已经设法解决了这个问题。事实证明,实现该页面大部分功能的开发人员在局部视图中都有此代码,而主视图每次移动某些东西时都会对控制器进行 ajax 调用。因此,局部的元素只是视觉表现。我必须创建一个新的 AJAx 调用来实现我想要的。
【解决方案2】:

我想出了如何以我想要的方式做到这一点:

   grid.Column("Select", header: "", format: (item) => @Html.Raw("<a href='" + item.GetSelectUrl() + "' /><img src='" + ((grid.SelectedRow == item) ? "../../Content/images/AdminSelect-ON.png" : "../../Content/images/AdminSelect-OFF.png") + "' />")),

【讨论】:

    【解决方案3】:

    如果你这样声明列:

    grid.Column("Select", "Select", format: @<input type="checkbox" name="selectedrows" value="@item.WedNo" />)
    

    然后在您的操作中,表单发布给您可以访问这些选定的项目,如下所示:

    public ActionResult Selections(string[] selectedrows)
    

    这里 selectedrows 将包含所有选中的复选框。

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2023-03-13
      • 2012-03-27
      • 2012-11-01
      • 2012-11-28
      • 2011-12-23
      • 2011-06-20
      • 2012-12-24
      • 2011-12-31
      相关资源
      最近更新 更多