不使用Shared文件夹在控制器之间共享视图

时间:2012-02-09 04:06:09

标签: c# asp.net-mvc model-view-controller

假设我有一个为学生提供搜索功能的控制器:

public class StudentSearchController
{
    [HttpGet]
    public ActionResult Search(StudentSearchResultModel model)
    {
        return View(model);
    }
}

只要为搜索操作提供了StudentSearchResultModel,它就会呈现搜索结果列表。

有没有办法从另一个控制器有效地扩展此操作方法?例如,假设我想要其他需要搜索学生的控制器,例如:

public class UniStudentController
{
    [HttpPost]
    public ActionResult Search(UniStudentSearchResultModel model)
    {
        return RedirectToAction("Search", "StudentSearch", model);
    }
}

public class HighSchoolStudentController
{
    [HttpPost]
    public ActionResult Search(HighSchoolSearchResultModel model)
    {
        return RedirectToAction("Search", "StudentSearch", model);
    }
}

(假设两个模型都扩展了StudentSearchResultModel。)

我显然无法做到这一点,因为我无法将预先实例化的模型类传递给搜索控制器(原始搜索控制器将重新创建StudentSearchResultModel,而不是使用传递的模型)。

到目前为止,我提出的最佳解决方案是将SearchView.cshtml移动到“Shared”文件夹中,然后我可以直接从Uni / HighSchool控制器渲染视图(而不是调用“RedirectToAction”)。这很好用,理论上我根本不需要StudentSearchController。但是,我正在构建遗留代码(在这个人为的示例中,StudentSearchController是遗留的),所以如果不进行大量的重构,“共享”文件夹对我来说不是一个选项。

另一种解决方案是将所有与搜索相关的操作放入StudentSearchController中 - 因此它将为UniStudentSearch和HighSchoolStudentSearch获取两个操作。我不喜欢这种方法,因为这意味着StudentSearchController需要知道所有的预期用法。

有什么想法吗?

PS:不反对重构,但受到最后期限的限制!

1 个答案:

答案 0 :(得分:7)

您可以在调用View()

的过程中放置​​视图的路径
return View("~/Views/StudentSearch/SearchView.cshtml", model);