Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 模板回发的复选框列表MVC编辑器_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 模板回发的复选框列表MVC编辑器

Asp.net mvc 模板回发的复选框列表MVC编辑器,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,我继承了一些不完整的代码。开发人员使用editorfor模板创建他的复选框列表。问题是它没有绑定回模型,因此我可以将数据返回到服务器端。 有没有人举过一个例子,说明如何使用editorfortemplate创建复选框列表,并将数据发送回绑定到模型? 下面是editortemplate内容 名为ServiceTypeViewModel.cshtml的编辑器模板 @model List<ViewModels.ServiceTypeViewModel> <table>

我继承了一些不完整的代码。开发人员使用editorfor模板创建他的复选框列表。问题是它没有绑定回模型,因此我可以将数据返回到服务器端。 有没有人举过一个例子,说明如何使用editorfortemplate创建复选框列表,并将数据发送回绑定到模型? 下面是editortemplate内容

名为ServiceTypeViewModel.cshtml的编辑器模板

     @model List<ViewModels.ServiceTypeViewModel>
<table>

@{int k = 0; int columns = 2;}

@for (int i = 0; i < (Model.Count / columns + (Model.Count % columns == 0 ? 0 : 1)); i++)
{
    <tr>
    @for(int j = 0; j<columns; j++){
        <td>
            @if (k<Model.Count) { 
                <input name="ProvidedServices[@(k)].Name" id="ProvidedServices__@(k)__Name" type="hidden" value="@Model[k].Name">       
                <input name="ProvidedServices[@(k)].Selected" class="CB" id="ProvidedServices__@(k)__Selected" type="checkbox" value="true">
                <input name="ProvidedServices[@(k)].Selected" type="hidden" value="false">
                <input name="ProvidedServices[@(k)].ServiceTypeClass" id="ProvidedServices__@(k)__ServiceTypeClass" type="hidden" value="@Model[k].ServiceTypeClass">       
                <input name="ProvidedServices[@(k)].ServiceType" id="ProvidedServices__@(k)__ServiceType" type="hidden" value="@Model[k].ServiceType">       
                @Html.DisplayFor(m=>Model[k].Name)
                k++;
            }
        </td>
    }
    </tr>
}
</table>
主模型中模板定义的编辑器

[UIHint("ServiceTypeViewModel")]
public List<ServiceTypeViewModel> ProvidedServices { get; set; }
如何将其显示为列表

我让它在模板中呈现,如上图所示,但回发将providerservices返回为null。下面的代码呈现两列复选框

@model List<ViewModels.ServiceTypeViewModel>
<table>
 @{int k = 0; int columns = 2;}

@for (int i = 0; i < (Model.Count / columns + (Model.Count % columns == 0 ? 0 : 1)); i++)
{
   <tr>
    @for(int j = 0; j<columns; j++){
     <td>
   @if (k<Model.Count) { 
    @Html.HiddenFor(m => m[k].Name);
    @Html.HiddenFor(m => m[k].ServiceTypeClass);
    @Html.HiddenFor(m => m[k].ServiceType);
    @Html.CheckBoxFor(m => m[k].Selected);
    @Html.DisplayFor(m => m[k].Name);
  k++;
      }
        </td>
    }
    </tr>
  }
</table>
@型号列表
@{int k=0;int columns=2;}
@对于(int i=0;i<(Model.Count/columns+(Model.Count%columns==0?0:1));i++)
{
@对于(int j=0;j m[k].ServiceTypeClass);
@Html.HiddenFor(m=>m[k].ServiceType);
@Html.CheckBoxFor(m=>m[k]。选中);
@DisplayFor(m=>m[k].Name);
k++;
}
}
}

ServiceTypeViewModel.cshtml
更改为

@model ViewModels.ServiceTypeViewModel

<tr>
  <td>
    @Html.HiddenFor(m > m.ServiceTypeClass)
    @Html.HiddenFor(m > m.ServiceType)
    @Html.CheckBoxFor(m > m.Selected)
    @Html.DisplayFor(m => m.Name)
  </td>
</tr>
在主要观点中

<div id="container">
  @Html.EditorFor(x => x.ProvidedServices) 
</div>
<table>
  <tr>
    @for(int i = 0; i < Model.ProvidedServices.Count; i++)
    {
      <td>
        @Html.HiddenFor(m => m.ProvidedServices[i].ServiceTypeClass)
        @Html.HiddenFor(m => m.ProvidedServices[i].ServiceType)
        @Html.CheckBoxFor(m => m.ProvidedServices[i].Selected)
        @Html.LabelFor(m => m.ProvidedServices[i].Selected, Model.ProvidedServices[i].Name)
      </td>
      if((i + 1) % 2 == 0)
      {
        @:</tr><tr>
      }
    }
  </tr>
</table>
这将生成一个2列,如中所示

或者,如果您确实想使用表(因为表用于表格数据,所以不太合适),则不能使用
EditorTempate
。相反,您需要在主视图中为循环使用

<div id="container">
  @Html.EditorFor(x => x.ProvidedServices) 
</div>
<table>
  <tr>
    @for(int i = 0; i < Model.ProvidedServices.Count; i++)
    {
      <td>
        @Html.HiddenFor(m => m.ProvidedServices[i].ServiceTypeClass)
        @Html.HiddenFor(m => m.ProvidedServices[i].ServiceType)
        @Html.CheckBoxFor(m => m.ProvidedServices[i].Selected)
        @Html.LabelFor(m => m.ProvidedServices[i].Selected, Model.ProvidedServices[i].Name)
      </td>
      if((i + 1) % 2 == 0)
      {
        @:</tr><tr>
      }
    }
  </tr>
</table>

@对于(int i=0;im.ProvidedServices[i].ServiceTypeClass)
@Html.HiddenFor(m=>m.ProvidedServices[i].ServiceType)
@Html.CheckBoxFor(m=>m.ProvidedServices[i]。选中)
@Html.LabelFor(m=>m.ProvidedServices[i]。选中,Model.ProvidedServices[i]。名称)
如果((i+1)%2==0)
{
@:
}
}

旁注:为属性
Name
包含一个隐藏输入是没有意义的。它是一个只读属性(无setter),因此无论如何都不会被绑定。

我更新了这个问题。你能帮我把它渲染成如图所示的列表吗?当然可以,但是你不能用
EditorTemplate
。您需要在视图中使用
for
循环,以便每行生成2列。现在没有时间(很晚了),但会在早上更新答案。但是为了让您开始,请看一看实际上您可以使用
EditorTemplate
,但是使用
元素而不是
,并设置样式(例如
显示:内联块;浮点;左;宽度:40%;
)我让它在编辑器模板中呈现,但返回时ProvidedServices的列表为空。我将更新问题
#container div {
  width: 50%;
  display: inline-block;
  float: left;
}
<table>
  <tr>
    @for(int i = 0; i < Model.ProvidedServices.Count; i++)
    {
      <td>
        @Html.HiddenFor(m => m.ProvidedServices[i].ServiceTypeClass)
        @Html.HiddenFor(m => m.ProvidedServices[i].ServiceType)
        @Html.CheckBoxFor(m => m.ProvidedServices[i].Selected)
        @Html.LabelFor(m => m.ProvidedServices[i].Selected, Model.ProvidedServices[i].Name)
      </td>
      if((i + 1) % 2 == 0)
      {
        @:</tr><tr>
      }
    }
  </tr>
</table>