【发布时间】:2015-04-01 19:32:40
【问题描述】:
我想创建一个包含来自用户的多个数据的注册页面
例如 1 - 我得到了一个带有基本 ID 和名称的 userViewModel,并得到了这个 View 的模型;
[Key]
public int CandidatoId { get; set; }
[Required(ErrorMessage = "Preencher o campo Nome")]
[MaxLength(150, ErrorMessage = "Máximo {1} caracteres")]
[MinLength(2, ErrorMessage = "Mínimo {1} caracteres")]
public string Nome { get; set; }
[Required(ErrorMessage = "Preencher o campo CPF")]
[MaxLength(15, ErrorMessage = "Máximo {1} caracteres")]
[MinLength(2, ErrorMessage = "Mínimo {1} caracteres")]
//Criar Datatype de CPF
public string CPF { get; set; }
2 - 也有个人数据:
public class DadosPessoaisViewModel
{
[Key]
public int CandidatoId { get; set; }
public char Sexo { get; set; }
[Required(ErrorMessage = "Preencher o campo Endereço")]
[MaxLength(500, ErrorMessage = "Máximo {0} caracteres")]
[MinLength(2, ErrorMessage = "Mínimo {0} caracteres")]
public string Endereco { get; set; }
public virtual Candidato Candidato { get; set; }
}
我会从用户那里获得更多关于 5 个或更多的数据,例如家庭信息等。
对于用户界面,我打算将它放在引导轮播中。
所以我为所有数据创建了一个通用 ViewModel(WithoutFisical 模型) 每一种用户数据对应一个视图模型:
//User ViewModel
public class DadosCandidatoViewModel
{
[Key]
public int CandidatoId { get; set; }
//User ViewModel
public virtual CandidatoViewModel Candidato { get; set; }
//Pessoal Data Info ViewModel
public virtual DadosPessoaisViewModel DadosPessoais { get; set; }
//will Be more data from user here
}
//User Pessoal Data VewModel ( Sample )
public class DadosPessoaisViewModel
{
[Key]
public int CandidatoId { get; set; }
public char Sexo { get; set; }
[Required(ErrorMessage = "Preencher o campo Endereço")]
[MaxLength(500, ErrorMessage = "Máximo {0} caracteres")]
[MinLength(2, ErrorMessage = "Mínimo {0} caracteres")]
public string Endereco { get; set; }
public virtual Candidato Candidato { get; set; }
}
所以我创建了一个编辑视图,其中所有用户数据都由部分视图分隔:
@model Gestao_RH.MVC.ViewModels.DadosCandidatoViewModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<!-- Div na qual o "carousel" será aplicado. -->
<div id="div-carousel" class="carousel slide">
<div class="carousel-inner">
<!-- Divs com efeito de transição. -->
<div class="item active">
@Html.Partial("~/Views/DadosPessoais/Edit.cshtml" , Neeed Passs DadosPessoaisViewModel Here???? )
</div>
<div class="item">
Conteúdo da DIV 2.
</div>
</div>
</div>
<div class="row">
<!-- Botões de navegação -->
<div id="div-1" class="span2">
<a id="a-1" class="btn" href="#div-carousel" data-slide="prev"><i class="icon-chevron-left"></i>Voltar para DIV 1</a>
</div>
<div id="div-2" class="span2">
<a id="a-2" class="btn" href="#div-carousel" data-slide="next">Avançar para DIV 2<i class="icon-chevron-right"></i></a>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
现在有一个问题......
我所有的部分视图都是强类型的,如上面的示例:
@model Gestao_RH.MVC.ViewModels.DadosPessoaisViewModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>DadosPessoaisViewModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.CandidatoId)
<div class="form-group">
@Html.LabelFor(model => model.Sexo, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Sexo, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Sexo, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Endereco, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Endereco, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Endereco, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.ActionLink("Save", "Edit", "DadosPessoais")
@*<input type="submit" value="Save" class="btn btn-default" />*@
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
问题是这个 View 需要一个 DadosPessoaisViewModel(用户个人数据),但在这个上下文中我只有 DadosCandidatoViewModel 可以发送。
例如对于我的控制器:
public class DadosCandidatoController : Controller
{
private readonly ICandidatoAppService _candidato;
public DadosCandidatoController(ICandidatoAppService candidato)
{
_candidato = candidato;
}
public ActionResult Edit(int id)
{
var cargo = _candidato.GetById(id);
var DadosCandidatoViewModel = Mapper.Map<Candidato, DadosCandidatoViewModel>(cargo);
return View(DadosCandidatoViewModel);
}
}
【问题讨论】:
-
表格在一页上?创建一个父视图模型,将每个子视图模型添加为属性,然后内联编辑整个表单。
-
布拉德,不明白... :(
-
您是否尝试制作一个更大的模型,其中包含这些部分模型的实例并稍后将它们发送到每个部分视图?