我的搜索表单显示在我的应用程序的每个页面上。它是使用子操作生成的:
[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操作(如果已填充)。这对我来说不合适。
有没有更好的方法或方法来做到这一点?
答案 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的属性为没有设定。