如何在ASP.NET MVC中将多个模型传递给视图?

7
问题是:我想运行三个不同的动作,但是我希望从单个动作中提供所有数据到一个更大的模型中。
我正在使用:
public class SearchScrapClass
    {
        public WClass WClass { get; set; }
        public SClass SClass { get; set; }
        public YClass YClass { get; set; }
    }

    public class WClass 
    {
        public string title { get; set; }
        public string link { get; set; }
    }
    public class SClass 
    {
        public string title { get; set; }
        public string link { get; set; }
    }
    public class YClass 
    {
        public string title { get; set; }
        public string link { get; set; }
    }

我正在使用LINQ来向这些模型中添加数据。

我正在使用:

      var wikians = from info in document.DocumentNode.SelectNodes("//div[@id='span']")
        from link in info.SelectNodes("div//a").Where(x => x.Attributes.Contains("href"))
         select new SearchScrapClass //Main Bigger Class
         {
            WClass.link= link.Attributes["href"].Value, //ERROR: How to add to WClass's url ?
            WClass.title= link.InnerText //ERROR: How to add to WClass's url ?
         }


var wikians = from info in document.DocumentNode.SelectNodes("//div[@id='results']")
               from link in info.SelectNodes("p//a").Where(x => x.Attributes.Contains("href"))
               select new SearchScrapClass //Main Bigger Class
                 {
                   YClass.link= link.Attributes["href"].Value, //ERROR: How to add to YClass's url ?
                   YClass.title= link.InnerText //ERROR: How to add to YClass's url ?
                 }

//Also for the 3rd class (model)


    return View(wikians); //and then return bigger class model so that i can access them in view

这是我想要给所有类的链接标题添加数据的一种方法。

我的尝试是从不同来源添加数据到所有3个类中,并将更大的模型传递到视图中,以便我可以访问所有类,例如:

@model SearchScrapClass
@using(Html.BeginForm()) {
    @Html.EditorFor(o => o.WClass.link)
    ...
}

请提供一种方法。
谢谢。

4
创建一个ViewModel,将三个模型绑定在一起,并将视图类型化为该ViewModel。 - Brian
我很困惑,为什么你有三个看起来完全一样的不同类?为什么不只使用三个相同类的实例呢? - hermiod
@hermiod:其实我展示的逻辑看起来很相似[略有修改],但提取URL和内容的源不同。因此我需要不同的类。 - Man8Blue
@Brian 是正确的。在MVC中,这么做的“正确”方式是创建一个ViewModel来包含这三个类。这些类是数据模型。ViewModel是另外一种东西,它应该包含你的View需要正确呈现所需的所有内容。 - Shai Cohen
4个回答

8
为了进一步说明我的评论,我建议为组织起见创建一个ViewModel文件夹。在这个文件夹中添加ViewModel。
public class SearchScrapClassViewModel
{
    SearchScrapClass searchScrap;
    WClass wClass;
    SClass sClass;
    YClass yClass;
}

在您的控制器中,您需要实例化一个新的视图模型。
SearchScrapClassViewModel model = new SearchScrapClassViewModel
{
    ....add in your logic to fill your class objects here


}

return view(model);

然后在你的视图中添加对ViewModel的using声明。

@using SearchScrapClassViewModel

你能详细说明一下视图方面吗?我该如何在视图中单独访问每个元素w、s、y? - Zapnologica

1

您可以通过创建一个新的模型类来传递多个模型,该类将包含多个对象。

public class MultiModel 
    {
     SearchScrapClass searchScrap;
     WClass wClass;
     SClass sClass;
     YClass yClass;
    }

然后你如何在视图中接收/使用那个类? - Zapnologica
Brian已经进一步解释了,您可以在视图中使用Modal来访问每个类,例如@Model.SearchScrapClass,Modal.WClasss。 - Imran Rashid

1

0
SearchScrapClassViewModel model = new SearchScrapClassViewModel
{
    ....add in your logic to fill your class objects here


}

我们在这里应用什么逻辑 "....在这里添加您的逻辑以填充您的类对象"


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