Asp.net MVC +多个PartialView +多个控制器

时间:2015-02-02 18:58:01

标签: asp.net-mvc partial-views

我想创建一个包含来自用户

的多个数据的注册页面

e.g。 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模型) 和每种用户数据的一个View模型:

//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(用户Perssonal数据)但我在此上下文中只有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);
    }
}

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您有两个相互依赖但视图不同的视图模型。解决此问题的最佳方法是使依赖属性成为整个页面视图模型的一方,这样两个视图都可以同时访问这些属性。

可以找到如何从多个部分视图访问视图模型的一个属性的问题here

答案 1 :(得分:0)

DadosCandidatosViewModel possui DadosPessoaisViewModel,vocênaopode chamar a partial view assim?

@Html.Partial("~/Views/DadosPessoais/Edit.cshtml" , Model.DadosPessoais)