使用ASP.NET MVC中父页面模型中的内容填充PartialView的模型

时间:2016-01-31 17:18:44

标签: c# asp.net asp.net-mvc razor model

我想弄清楚如何填充我的部分视图的模型。例如,PartialView模型包括用户在诸如Subject和NoteContent之类的注释对话框中输入的所有内容,但它还需要来自父页面的模型的唯一ID,这是产品ID。这样,当从对话窗口保存笔记时,我可以为该特定产品保存笔记。

在下面的示例中,如果用户在ParentPage上查看具有Id 12的产品并想要添加注释,则他们将单击Notes按钮以打开对话窗口,填写主题和内容并点击提交。在提交给控制器期间,EntityModule应该=“Product”,如果ProductId是12,则EntityKey应该= 12.我试图弄清楚NoteViewModel将如何从父ViewModel检索这两个字段。

ProductViewModel.cshtml

public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }

NoteViewModel.cshtml

public int Id { get; set; }
public string EntityModule { get; set; }
public int EntityKey { get; set; }
public string Subject { get; set; }
public string Content { get; set; }

ParentPage.cshtml

@model MyApp.Web.ViewModels.Shared.ProductViewModel
@{ await Html.RenderPartialAsync("_NotesPartial"); }

_NotesPartial.cshtml

@model MyApp.Web.ViewModels.Shared.NoteViewModel
<button id="open" class="btn btn-primary">Notes</button>

@(Html.Kendo().Window()
    .Name("window")
    .Title("About Alvar Aalto")
    .Visible(false)
    .Draggable()
    .Resizable()
    .Width(600)
    .Actions(actions => actions.Pin().Minimize().Maximize().Close())
    .Content(@<text>
    <form asp-action="_NotesPartial">
        <div class="form-horizontal">
            <h4>NoteViewModel</h4>
            <hr />
            <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Subject" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="Subject" class="form-control" />
                    <span asp-validation-for="Subject" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Content" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <textarea asp-for="Content" class="form-control" cols="40" rows="4"></textarea><span asp-validation-for="Content" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Save" class="btn btn-default" />
                </div>
            </div>
        </div>
    </form>
    </text>)
)

<script>
    $("#open").click(function () {
        var win = $("#window").data("kendoWindow");
        win.center();
        win.open();
    });
</script>

1 个答案:

答案 0 :(得分:1)

其中一种方法是通过父页面填充并传递模型。例如:

public class ProductViewModel {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public NoteViewModel Note { get; set;}
}

然后,使用这样的东西:

@{ await Html.RenderPartialAsync("_NotesPartial", Model.Note); }

MVC6中没有RenderAction,这是一个很好的解决方案:

Html.RenderAction("_NotesPartial", new { id = ProductViewModel.Id })

但你仍然可以在MVC5中使用它。