C# 如何在布局模板中将数据从控制器动作传递到子动作?

C# 如何在布局模板中将数据从控制器动作传递到子动作?,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我有一个搜索表单,它显示在我的应用程序的每个页面上。它是使用子操作生成的: [ChildActionOnly] public PartialViewResult Form(SearchFormViewModel model) { model.LanguageList = ReferenceService.GetLanguageList(); model.SubjectList = ReferenceService.GetSubjectList(); return Par

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

[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; }
}
表单是通过GET提交的,例如
/search/results?Subject=1&Location=United+Kingdom
,因此表单填充在结果页面上,页面的操作执行搜索并显示结果

public ViewResult Results(SearchFormViewModel searchModel)
{
...
我还有一个操作来处理一些友好的URL进行搜索,例如
/computing/united kingdom
,它使用自定义路由来引导正确的操作

public ViewResult FriendlyResults(string subject, string location)
此操作将url组件与搜索参数匹配,执行搜索并显示结果

public ViewResult Results(SearchFormViewModel searchModel)
{
...
我要做的是在搜索表单中填充友好URL,即将搜索参数传递给
表单
子操作,以便您可以查看搜索的内容

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


有更好的方法吗?

如果要在布局中引用它,必须使用
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; }
}
公共类搜索响应{
公共列表结果{get;set;}
公共搜索查询{get;set;}
}
公共类搜索查询{
公共字符串主题{get;set;}
公共字符串位置{get;set;}
}
因此,您将拥有类型为
SearchResponse

编辑


在您的情况下,我只需调用
@Html.Action(“Form”,“Search”,ViewBag.SearchQuery)
,并仅将
ViewBag.SearchQuery
设置为
结果(SearchFormViewModel searchModel)
操作,因此,如果没有设置there ViewBag的属性,则传入null。

这种方法的问题是,搜索表单会在所有页面的标题上重复,因此将表单放入视图将意味着在每个视图上重复该表单。@OllieP即使搜索字段在每个页面上,不是只有一个结果页面吗,因此,只有一种情况下它会被预填充?是的,只有一种情况下它会被预填充,但使用您的解决方案,我仍然需要在每个视图上声明搜索表单,不是吗?@OllieP如果您确实需要
操作
呈现(发布您的操作代码,也许我可以建议),您只需处理一个空的viewmodel,然后从
ViewBag
传递它。我正在从存储库填充搜索表单中使用的列表,因此它必须使用
操作。