我想要的是拥有一个部分视图,其中包含系统中所有可用语言的下拉列表。此局部视图将在许多编辑模板中使用,并将从单独的控制器加载。
根据网上的文章和信息,我有以下实现:
ViewModel
public class LanguagesViewModel
{
public int SelectedID { get; set; }
public virtual SelectList Languages { get; set; }
public LanguagesViewModel(int selectedID, IEnumerable<Language> languages)
{
SelectedID = selectedID;
Languages = new SelectList(languages, "LanguageId", "Name");
}
}
在共享文件夹中,我有一个文件:_LanguageDropDownList.cshtml和
@model XNETProductQuote.Web.Models.LanguagesViewModel
@Html.DropDownListFor(model => model.SelectedID, Model.Languages)
我有一个LanguageController,它有以下实现
public ActionResult GetAllLanguages()
{
var languages = service.GetAll();
return PartialView("_LanguageDropDownList", new LanguagesViewModel(1, languages));
}
因此,上面的内容是为了在部分视图中加载下拉列表,这样我就可以在其他模板中使用它。
从另一个控制器(ApplicationSetting)加载的模板中,我使用调用部分视图
@Html.Action("GetAllLanguages", "LanguageController")
这行不通。它抛出一个异常:未找到路径"/ApplicationSetting/Edit/1"的控制器,或者该控制器未实现IController。
这种情况的正确实施是什么?
感谢
在Asp.Net MVC中,当我们制作一个新控制器时,'Controller'
后缀会自动附加到控制器名称上,例如:-在您的情况下,如果您将'Language'
名称赋予控制器,则控制器的完整名称将类似于'LanguageController'
,所以,如果你想给控制器命名,你必须只使用'Language'
而不是'LanguageController'
,而@Html.Action()
的过载之一是ControllerName
,它只是'Language'
而不是'LanguageController'
,所以在你的问题中,只需用@Html.Action("GetAllLanguages", "Language")
更改@Html.Action("GetAllLanguages", "LanguageController")
,你的问题就会得到解决。