MVC共享部分视图,带有下拉菜单和单独的控制器



我想要的是拥有一个部分视图,其中包含系统中所有可用语言的下拉列表。此局部视图将在许多编辑模板中使用,并将从单独的控制器加载。

根据网上的文章和信息,我有以下实现:

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"),你的问题就会得到解决。

最新更新