【问题标题】:Custom ActionResult equivalent Model for all PartialViews所有 PartialViews 的自定义 ActionResult 等效模型
【发布时间】:2016-04-14 20:39:24
【问题描述】:

我创建了以下自定义ActionResult,它返回多个部分视图。

public class MultiplePartialViewsResult : ActionResult
{
    private const string Separator = "-";
    private PartialViewResult[] _partialViews;

    public MultiplePartialViewsResult(params PartialViewResult[] partialViews)
    {
        _partialViews = partialViews;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        foreach (var partialView in _partialViews)
        {
            partialView.ExecuteResult(context);
            context.HttpContext.Response.Output.Write(Separator);
        }
    }
}

然后我使用如下:

return new MultiplePartialViewsResult(
             PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }),
             PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 }));

但是如果我在MultiplePartialViewsResult 的构造函数中放置断点,我会看到这两种情况下的模型都等于2.0。它使用数组中指定的最后一个模型覆盖所有模型。

尝试在方法中创建几个 PartialView 并将其分配给变量。然后你会注意到它们都共享相同的模型。

【问题讨论】:

  • 是的,它是正确的。如果您尝试将两个models 返回到一个视图,请创建一个包含您要发送的两个模型的view model,并制作您的视图模型新的ViewModel
  • 这就是我试图回到许多观点的观点。想法基于这篇文章,作者指出模型可以是不同的。 simple-talk.com/dotnet/asp.net/…
  • 检查最后的东西了吗?它说要使用由partial view 共享的view model
  • "在示例中,两个局部视图使用相同的视图模型。但这不是限制。"
  • 是的。所以在你的例子中你必须使用单个view model

标签: asp.net asp.net-mvc razor asp.net-mvc-partialview actionresult


【解决方案1】:

您可以通过以下方式使用 new own ViewData / ViewData.Model 实例初始化 MultiplePartialViewsResult 对象(对我来说很好):

return new MultiplePartialViewsResult(
    //PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }),
    //PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 })
    new PartialViewResult() { ViewName = "~/Views/RowSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 1.0 } } },
    new PartialViewResult() { ViewName = "~/Views/ColumnSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 2.0 } } }
);

自定义操作结果:

public class MultiplePartialViewsResult : ActionResult {
    private const string Separator = "-";
    private PartialViewResult[] _partialViews;

    public MultiplePartialViewsResult(params PartialViewResult[] partialViews) {
        _partialViews = partialViews;
    }

    public override void ExecuteResult(ControllerContext context) {
        foreach(var partialView in _partialViews) {
            partialView.ExecuteResult(context);
            context.HttpContext.Response.Output.Write(Separator);
        }
    }
}

控制器:

public ActionResult Index() {
    return View();
}
public ActionResult FakeAction() {
    return new MultiplePartialViewsResult(
        //PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }),
        //PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 })
        new PartialViewResult() { ViewName = "~/Views/RowSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 1.0 } } },
        new PartialViewResult() { ViewName = "~/Views/ColumnSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 2.0 } } }
    );
}

观看次数:

索引:

@Html.Action("FakeAction")

ColumnSumView.cshtml / RowSumView.cshtml:

@model List<double>
<ul>
    @foreach(double item in Model) {
        <li>@item</li>
    }
</ul>

【讨论】:

  • 这是一种解决方法,但我想知道为什么我的示例不起作用。有没有更好的方法来传递多个局部视图?
  • 它似乎与在渲染 PartialView 时持有 ViewData/Model 对象有关(每个 ActionResult 一个 ViewData)。这可能是预期的行为。我会尝试检查是否有更好的解决方案。现在,您可以使用我建议的方法并始终使用新的 ViewData/Model 实例初始化每个 ActionResult/PartialViewResult。
  • 发生这种情况是因为Maximum用来创建每个部分结果的控制器的PartialView帮助器。该助手将在 ViewData.Model 中设置模型,其中 ViewData 是the controller 中的一个属性。调用两次PartialResult 将覆盖 ViewData.Model
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2018-09-30
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2011-12-02
相关资源
最近更新 更多