【问题标题】:MVC - how to send to the partial view ViewModel containing a listMVC - 如何发送到包含列表的局部视图 ViewModel
【发布时间】:2017-01-15 14:02:17
【问题描述】:

我是 MVC 的初学者,我有一个 Web 应用程序,在我的控制器中我声明了一个对象列表(来自访问者的反馈),然后将其发送到显示它的视图。它看起来像这样。声明:

public class TrekFeedbackItem
    {   
        public string trekid { get; set; }
        public string comment { get; set; }
        public string author { get; set; }

        public TrekFeedbackItem(string trekid, string comment, string author)
        {   this.trekid = trekid;
            this.comment = comment;
            this.author = author;
        }    
    }

及用法:

List<TrekFeedbackItem> feedbackList = new List<TrekFeedbackItem>
{
  //constructor called, data entered into the list 
}
return View(trekname, feedbackList);

但是,现在我还需要传递另一个列表,我们称之为 relatedblogsList。作为第一步,我决定将我的 feedbackList 封装到 ViewModel 中(一旦它工作,添加另一个不同对象的列表。)

public class TrekViewModel
    {
        public List<TrekFeedbackItem> feedback { get; set; }
    }               

并像这样填充数据:

TrekViewModel trek = new TrekViewModel();
trek.feedback = new List<TrekFeedbackItem>
    {
    //insert data here     
    };
return View(view, trek);

问题是 - 如何将此模型发送到局部视图以及如何访问它

非常感谢

【问题讨论】:

  • 在视图中,您插入的是 TrekViewModel 类的对象,而不是列表本身。 “跋涉”不是一个列表。
  • 您需要将局部视图的模型设置为TrekViewModel

标签: c# asp.net-mvc asp.net-mvc-4 model asp.net-mvc-partialview


【解决方案1】:

您可以将数据传递到部分视图中,如下所示

从控制器返回这个视图:

return PartialView("_partial_viewname", trek);

然后在局部视图的开头:

@model Models.TrekViewModel 

之后你可以在局部视图中使用Model.feedback

【讨论】:

  • 嗨,如果我在主布局中使用 return PartialView("_partial_viewname, trek);,我会收到错误 当前上下文中不存在名称 Trek。知道如何解决吗?
  • 嗨,return PartialView("_partialViewName, viewModel); 应该在控制器操作方法中,部分视图应该有@model modelPath.TrekViewModel,如果这两个步骤是正确的,那么模型对象在同一个上下文(在你的情况下它是跋涉视图模型)。
  • 嗨,现在我可以看到(在我将断点放入局部视图之后)模型已正确发送。最后一个问题——我想遍历这个模型并显示数据。怎么做?我使用这个命令 - foreach (var std in Model.feedback as IList&lt;MVC.Controllers.TrekViewModel)。但我无法通过此命令访问单个属性 - @std.feedback.comment 任何想法如何做到这一点?
  • 您好,您正在遍历 Model.feedback 列表项,一旦您添加了 foreach(Model.feedback 中的 var std)之类的代码,就无需再次进入反馈列表,因为项目已分配给每个循环中的 std 变量。所以只需使用@std.comment
  • 虽然我也是这样,但是当我使用@std.comment 时,Visual Studio 向我显示错误“MVC.Controllers.TrekViewModel 不包含'comment'的定义并且没有扩展方法'comment'接受MVC.Controllers.TrekViewModel 类型的第一个参数”
【解决方案2】:

将动作控制器的返回类型设置为“PartialView”而不是“View”。

return PartialView("_yourPartialViewName", yourObject);

如果应用程序无法按预期运行,请构建它并重新运行它。

【讨论】:

  • 嗨,我在主布局中使用这个命令 - @Html.Partial("~/Views/Shared/Sub/sidebar_trek.cshtml")。经过一番谷歌搜索后,我发现我不需要再次将那个“跋涉”传递给局部视图,如果我将它发送到主布局,它可以通过局部视图访问。我现在不知道的是 - 如何在局部视图中访问这个模型?
  • 确保您的主视图使用您的视图模型进行强类型化,否则它将无法工作。在您的主布局顶部添加@model Models.TrekViewModel。现在您可以像这样在视图主体中访问此模型:@Model.feedback
  • 谢谢。当我将断点放入局部视图时,我可以看到我的模型和数据——它们被正确发送。最后一个问题——我想遍历这个模型并显示数据。怎么做?我使用这个命令 - foreach (var std in Model.feedback as IList&lt;MVC.Controllers.TrekViewModel)。但我无法通过此命令访问单个属性 - @std.feedback.comment 任何想法如何做到这一点?
  • 试试@std.comment
  • 试过了,还是不行。当我在调试模式下打开局部视图时,我看到以下结构:this -> Base -> Model -> feedback -> [0]/[1](模型现在有 2 个条目)-> properties author/comment/trekid (具有正确的值)。现在只是想知道如何显示它们:)
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 2013-07-14
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多