数据库中table的每条记录的动态输入
A dynamic input for each record of a table in the database
我有一个名为 UserFunctions 的 属性,我有几个函数,必须为每个函数分配一个用户。我有一个 return 用户列表的 EditorTemplate。我必须为数据库中注册的每个函数动态创建一个字段,每个字段都将使用 EditorTemplate 列出用户。 (如下图)。我创建了一个 EditorTemplate (UserFunctions.cshtml) 强类型(模型 ICollection )来生成字段,如下图所示,但我不知道该怎么做才能将值 returned 到模型。我想到了使用隐藏的多选,但是很复杂。
我的class
public class FunctionUser //Não mapeado
{
public int IdFuncao { get; set; } //functin id
public string Usuario { get; set; } //User
public string DscFuncao { get; set; } //Function Description
}
视图中的我的字段(属性 UserFunctions)
@Html.EditorFor(i => i.UserFunctions, "UserFunctions")
我的编辑器模板 -> UserFunctions.cshtml
@model ICollection<FunctionUser>
@{
var modelMetaData = this.ViewData.ModelMetadata;
var propertyName = modelMetaData.PropertyName;
}
@foreach (FunctionUser item in this.Model)
{
var id = "id" + Guid.NewGuid().ToString().Substring(0, 5);
List<SelectListItem> listValues = new List<SelectListItem>();
if (!string.IsNullOrEmpty(item.Usuario))
{
listValues.Add(new SelectListItem { Selected = true, Text = item.Usuario, Value = item.Usuario });
}
<div id="@id" class="field-middle">
<h3>@String.Format(ModeloResources.ProductDevelopment, item.DscFuncao) :</h3>
@Html.DropDownList("", listValues, new { id = "PD" + item.IdFuncao.ToString() })
</div>
<script language="javascript" type="text/javascript">
$("#@id select")
.turnAutoComplete("@Url.Action("UsersListJson", "Security")");
</script>
}
<select name="@propertyName" multiple="multiple" size=30 style='height: 100%;' >
@foreach (FunctionUser item in this.Model)
{
<option value="@item.IdFuncao">teste</option>
}
</select>
有人在 "pt.whosebug.com" 中回答了我的问题。解决方案是使用 BeginCollectionItem 包。
型号:
public partial class Modelo
{
public ICollection<FuncaoUsuario> ProductDevelopment { get; set; }
//Continua...
}
public class FuncaoUsuario
{
public int IdFuncao { get; set; }
public string Usuario { get; set; }
public string DscFuncao { get; set; }
}
控制器:
public ViewResultBase Editar(int id)
{
Modelo model = this.Service.GetForEdit(this.IdEmpresa, id);
return base.SwitchView(model);
}
主视图:
@model Modelo
<div class="box-fields">
@using (Ajax.BeginForm(
this.DefaultActionEdit,
"Modelo",
new DefaultAjaxOptions()
))
{
@Html.EditorFor(i => i.ProductDevelopment) //precisa desta propriedade na view principal, pra nao dar o erro mencionado abaixo. E tem que remover o template Collection.cshtml.
foreach (FuncaoUsuario userFunction in this.Model.ProductDevelopment)
{
Html.RenderPartial("_UsuarioFuncao", userFunction);
}
//Mais coisas....
}
局部视图:
@model FuncaoUsuario
@using (Html.BeginCollectionItem("ProductDevelopment"))
{
List<SelectListItem> listValues = new List<SelectListItem>();
if (!string.IsNullOrEmpty(this.Model.Usuario))
{
listValues.Add(new SelectListItem { Selected = true, Text = this.Model.Usuario, Value = this.Model.Usuario });
}
@Html.HiddenFor(x => x.IdFuncao)
@Html.EditorFor(x => x.Usuario, "Usuario")
}
正在关注 link:
Solution using BeginCollectionItem
我有一个名为 UserFunctions 的 属性,我有几个函数,必须为每个函数分配一个用户。我有一个 return 用户列表的 EditorTemplate。我必须为数据库中注册的每个函数动态创建一个字段,每个字段都将使用 EditorTemplate 列出用户。 (如下图)。我创建了一个 EditorTemplate (UserFunctions.cshtml) 强类型(模型 ICollection )来生成字段,如下图所示,但我不知道该怎么做才能将值 returned 到模型。我想到了使用隐藏的多选,但是很复杂。
我的class
public class FunctionUser //Não mapeado
{
public int IdFuncao { get; set; } //functin id
public string Usuario { get; set; } //User
public string DscFuncao { get; set; } //Function Description
}
视图中的我的字段(属性 UserFunctions)
@Html.EditorFor(i => i.UserFunctions, "UserFunctions")
我的编辑器模板 -> UserFunctions.cshtml
@model ICollection<FunctionUser>
@{
var modelMetaData = this.ViewData.ModelMetadata;
var propertyName = modelMetaData.PropertyName;
}
@foreach (FunctionUser item in this.Model)
{
var id = "id" + Guid.NewGuid().ToString().Substring(0, 5);
List<SelectListItem> listValues = new List<SelectListItem>();
if (!string.IsNullOrEmpty(item.Usuario))
{
listValues.Add(new SelectListItem { Selected = true, Text = item.Usuario, Value = item.Usuario });
}
<div id="@id" class="field-middle">
<h3>@String.Format(ModeloResources.ProductDevelopment, item.DscFuncao) :</h3>
@Html.DropDownList("", listValues, new { id = "PD" + item.IdFuncao.ToString() })
</div>
<script language="javascript" type="text/javascript">
$("#@id select")
.turnAutoComplete("@Url.Action("UsersListJson", "Security")");
</script>
}
<select name="@propertyName" multiple="multiple" size=30 style='height: 100%;' >
@foreach (FunctionUser item in this.Model)
{
<option value="@item.IdFuncao">teste</option>
}
</select>
有人在 "pt.whosebug.com" 中回答了我的问题。解决方案是使用 BeginCollectionItem 包。
型号:
public partial class Modelo
{
public ICollection<FuncaoUsuario> ProductDevelopment { get; set; }
//Continua...
}
public class FuncaoUsuario
{
public int IdFuncao { get; set; }
public string Usuario { get; set; }
public string DscFuncao { get; set; }
}
控制器:
public ViewResultBase Editar(int id)
{
Modelo model = this.Service.GetForEdit(this.IdEmpresa, id);
return base.SwitchView(model);
}
主视图:
@model Modelo
<div class="box-fields">
@using (Ajax.BeginForm(
this.DefaultActionEdit,
"Modelo",
new DefaultAjaxOptions()
))
{
@Html.EditorFor(i => i.ProductDevelopment) //precisa desta propriedade na view principal, pra nao dar o erro mencionado abaixo. E tem que remover o template Collection.cshtml.
foreach (FuncaoUsuario userFunction in this.Model.ProductDevelopment)
{
Html.RenderPartial("_UsuarioFuncao", userFunction);
}
//Mais coisas....
}
局部视图:
@model FuncaoUsuario
@using (Html.BeginCollectionItem("ProductDevelopment"))
{
List<SelectListItem> listValues = new List<SelectListItem>();
if (!string.IsNullOrEmpty(this.Model.Usuario))
{
listValues.Add(new SelectListItem { Selected = true, Text = this.Model.Usuario, Value = this.Model.Usuario });
}
@Html.HiddenFor(x => x.IdFuncao)
@Html.EditorFor(x => x.Usuario, "Usuario")
}
正在关注 link: Solution using BeginCollectionItem