c# - 如何将数据从 Controller 操作传递到布局模板中的子操作?

标签 c# asp.net-mvc-4

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

[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/

相关文章:

c# - foreach循环,判断哪次是循环的最后一次迭代

ajax - 如何使用 Ajax 使用 VS 2012 Internet 模板更新 RenderBody() 部分?

asp.net - 将 asp.net.mvc 添加到 ASP.NET : Controllers folder

asp.net-mvc-4 - 如何在 Kendo UI Grid 中的页面加载时展开所有行?

c# - 如何使用控制台应用程序和流阅读器的拖放功能

c# - .Net Core - 将 API 中间件中的依赖项 IUserInfo 注入(inject)到存储库层

C# SQL Server 比较日期和字符串

javascript - ASP.NET 仅在满足条件时才执行 JavaScript 在 C# 代码后面确认警报消息

javascript - MVC jQuery Ajax Post - 只能让它使用硬编码值

c# - Asp.Net MVC4 中的复选框列表