如何将数据从控制器操作传递到布局模板中的子操作?

时间:2013-09-13 16:38:41

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

我的搜索表单显示在我的应用程序的每个页面上。它是使用子操作生成的:

[ChildActionOnly]
public PartialViewResult Form(SearchFormViewModel model)
{
    model.LanguageList = ReferenceService.GetLanguageList();
    model.SubjectList = ReferenceService.GetSubjectList();

    return PartialView("_SearchForm", model);
}

和以下视图模型

public class SearchFormViewModel
{
    public int Page { get; set; }

    public string Name { get; set; }

    public string Location { get; set; }

    public IList<Subject> SubjectList { get; internal set; }

    public IList<Language> LanguageList { get; internal set; }
}

并从我的布局调用,我的所有观点都继承自。

@Html.Action("Form", "Search")

表格是通过GET提交的,例如/search/results?Subject=1&Location=United+Kingdom,因此表单会填充在结果页面上,页面操作会执行搜索并显示结果。

public ViewResult Results(SearchFormViewModel searchModel)
{
...

我还有一个动作来处理一些友好的网址,例如搜索/computing/united-kingdom使用自定义路由指示正确操作。

public ViewResult FriendlyResults(string subject, string location)

此操作将匹配网址组件以搜索参数,执行搜索并显示结果。

我想要做的是填写友好网址的搜索表单,即将搜索参数传递给Form子操作,以便您可以看到搜索到的内容。

我能想到的唯一方法是将“友好搜索”模型存储在ViewBag中,并将其作为参数传递给Form操作(如果已填充)。这对我来说不合适。

有没有更好的方法或方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

如果要在布局中引用它,则必须使用ViewBag。但是如果你可以直接在视图中引用它(也可以在一个部分中),你可以简单地建立一个封装搜索查询和结果的模型。缩短示例需要以下内容:

public class SearchResponse {
    public List<SearchResults> Results { get; set; }
    public SearchQuery { get; set; }
}

public class SearchQuery{
   public string Subject { get; set; }
   public string Location { get; set; }
}

那么,您将有严格类型SearchResponse

类型的视图

修改

在您的情况下,我只需致电@Html.Action("Form", "Search", ViewBag.SearchQuery)并仅将ViewBag.SearchQuery设置为 Results(SearchFormViewModel searchModel) 操作,因此当ViewBag的属性为没有设定。