【问题标题】:Asp.net MVC + Multiple PartialView + Multiple ControllersAsp.net MVC + 多个 PartialView + 多个控制器
【发布时间】: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);
    }
}

【问题讨论】:

  • 表格在一页上?创建一个父视图模型,将每个子视图模型添加为属性,然后内联编辑整个表单。
  • 布拉德,不明白... :(
  • 您是否尝试制作一个更大的模型,其中包含这些部分模型的实例并稍后将它们发送到每个部分视图?

标签: asp.net-mvc partial-views


【解决方案1】:

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

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

【讨论】:

  • 不完全...我需要发送另一个模型到局部视图。喜欢:@Html.Partial("~/Views/DadosPessoais/Edit.cshtml" , DadosPessoaisViewModel)。
猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多