我有一个搜索表单,显示在我的应用程序的每个页面上。它是使用子操作生成的:
[ChildActionOnly]
public PartialViewResult Form(SearchFormViewModel model)
{
model.LanguageList = ReferenceService.GetLanguageList();
model.SubjectList = ReferenceService.GetSubjectList();
return PartialView("_SearchForm", model);
}
以及以下 View 模型
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; }
}
并从我的布局中调用,我的所有 View 都继承自该布局。
@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)
此操作将 URL 组件与搜索参数相匹配,执行搜索并显示结果。
我想要做的是填充友好网址的搜索表单,即将搜索参数传递给 Form
子操作,以便您可以看到您搜索的内容。
我能想到的唯一方法是将“友好搜索”模型存储在ViewBag
中,并将其作为参数传递给表单操作(如果已填充)。这对我来说感觉不对。
是否有更好的方法或方法来做到这一点?
最佳答案
如果你想在布局中引用它,你必须使用ViewBag
。但是,如果您可以直接在 View 中(也可以在一个部分中)引用它,您就可以简单地拥有一个封装搜索查询和结果的模型。缩短示例如下:
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
类型的严格类型 View
编辑
就您而言,我只需调用 @Html.Action("Form", "Search", ViewBag.SearchQuery)
并仅将 ViewBag.SearchQuery
设置为Results(SearchFormViewModel searchModel)
操作,因此在未设置 ViewBag 的属性时传入 null。
关于c# - 如何将数据从 Controller 操作传递到布局模板中的子操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18791203/