将不同的模型传递给局部视图

23

我试图从一个视图中向局部视图传递不同的模型。我有两个不同的控制器操作和两个不同的视图模型。但是当我在视图中调用局部视图时,它会给我一个错误:

传递到字典中的模型项的类型为“Application.ViewModels.Model1ViewModel”,但此字典需要类型为“Application.ViewModels.PartialViewModel”的模型项。

我这样调用它:

 @Html.Partial("_CreateUniFunctionPartial")

模型在视图中的调用为

@model Application.ViewModels.Model1ViewModel

部分视图文件中的模型是

@model Application.ViewModels.PartialViewModel

我不确定如何传递这个局部视图,以便它不会出现此错误。

编辑

局部视图

@model Application.ViewModels.PartialViewModel



 @using (Html.BeginForm("partialview", "ApplicationDetail", FormMethod.Post)) 
  {


<div class="form-horizontal">
    <h4>UniFunctionViewModel</h4>
    <hr />
    @Html.ValidationSummary(true)





    <div class="form-group">
        @Html.LabelFor(model => model.detail, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.detail, new { @placeholder = "Further Information" })
            @Html.ValidationMessageFor(model => model.detail)
        </div>
    </div>


</div>

想要了解如何在.NET Core 2.1到3.1中解决此问题的人,请参阅https://learn.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/partial-tag-helper?view=aspnetcore-3.1。 - Theophilus
3个回答

35

您使用了正确的方法,但没有传入正确的参数。

您可能希望尝试这样做:

@Html.Partial("~/[path_to_root_only_if_exists]/_CreateUniFunctionPartial.cshtml", new Application.ViewModels.PartialViewModel())
如果您没有传入一个模型,它会自动使用其父级的模型,而在您的情况下是:

如果你没有传入一个模型,它会自动从其父级中获取一个模型,而在你的情况下是

Application.ViewModels.Model1ViewModel

如果您有一个需要从数据库获取数据、执行复杂操作等的视图,那么您仍然可以通过将数据映射到模型属性来使用RenderPartial,请参考这里 - Shaiju T

12

您需要做的一件事是重新生成模型或利用模型中的属性。例如:

 public class OuterViewModel
 {
     public InnerViewModel InnerViewModel { get; set; }
 }

 public class InnerViewModel
 {
     public string SomeProperty { get; set; }
 }
在顶部页面,您可以接受OuterViewModel,然后将InnerViewModel传递给Partial。
Outer.cshtml:
 @model OuterViewModel
 @Html.Partial("_InnerPartial", Model.InnerViewModel)

_InnerPartial.cshtml:

 @model InnerViewModel
 @using (Html.BeginForm("Inner", "Controller"))
 {
      <div>
          @Html.AntiForgeryToken()
          @Html.TextBoxFor(m => m.SomeProperty)
          <input type="submit" value="Save" />
      </div>
 }

2

这很容易实现。有一个HTML指令可以呈现部分视图。以下是代码示例:

 @Html.Partial("nameOfPartial", Model)

现在这里的 Model 可以来自您的主控制器。

或者您可以定义一个新的控制器操作,其返回类型为 PartialViewResult,并尝试像这样在页面中呈现它:

@{Html.RenderAction("Someaction", "somecontroller");}

2
@Html.Partial("nameOfPartial", Model) 这样提供模型是行不通的。它仍然会与主视图中的模型冲突。局部视图包含一个表单,当我使用RenderAction方法时,它会获取提交吗? - user3541362
我不确定render action是否有效,但你可以尝试一下。唯一的区别是renderaction将加载一个返回partialviewresult而不是viewresult的操作。试试看是否有效。 - qamar
是的,我有。我有一个获取控制器和一个提交控制器。 - user3541362
你的局部视图中没有提交按钮?你怎么期望它提交值呢? - qamar
我在我的主视图中有一个提交按钮。我希望它使用该提交按钮而不是自己的。 - user3541362
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接