2

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

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

public ViewResult Results(SearchFormViewModel searchModel)
{
...

我还有一个操作来处​​理一些友好的 url 以进行搜索,例如/computing/united-kingdom,它使用自定义路由来指导正确的操作。

public ViewResult FriendlyResults(string subject, string location)

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

我想要做的是为友好的 url 填充搜索表单,即将搜索参数传递给Form子操作,这样你就可以看到你搜索的内容。

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

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

4

1 回答 1

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.SearchQueryResults(SearchFormViewModel searchModel)操作,因此在未设置 ViewBag 的属性时传入 null 。

于 2013-09-13T17:37:35.673 回答