C# 使用C从控制器访问MVC帮助程序方法

C# 使用C从控制器访问MVC帮助程序方法,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我需要创建一个助手来构建几个控制器方法中使用的Dropdownlists namespace Heelp.Helpers { public class PTDistrictHelpers { public IEnumerable<SelectListItem> DropDownList(IList<PTDistrictDto> ptDistrictsDto, int selectedValue = GlobalConstants.DROPD

我需要创建一个助手来构建几个控制器方法中使用的Dropdownlists

namespace Heelp.Helpers
{
    public class PTDistrictHelpers
    {
        public IEnumerable<SelectListItem> DropDownList(IList<PTDistrictDto> ptDistrictsDto, int selectedValue = GlobalConstants.DROPDOWNLIST_NO_SELECTED_VALUE)
        {
            var ptDistrictsViewModel = Mapper.Map<IList<PTDistrictDto>, IList<PTDistrictViewModel>>(ptDistrictsDto);

            var ptDistrictsList = ptDistrictsViewModel.Select(district =>
                new SelectListItem
                {
                    Value = district.Id.ToString(),
                    Text = district.Name,
                    Selected = (district.Id == selectedValue)
                });

            return ptDistrictsList;
        }
    }
}
控制器方法:

    [AllowAnonymous]
    public virtual PartialViewResult AdvancedSearch()
    {
       // District
        var dropdown = new Heelp.Helpers.PTDistrictHelpers();

        dropdown. <== The DropDownList method don't appears when I hit the "." why?
    }
我们的想法是在Web项目中创建一个类,在该类中,我可以将我将要使用的所有代码放在项目中调用业务层中不可用的服务层方法的多个位置,因为它们与Web层相关,如SelectListItem,如果您计划返回PartialViewResult,那么您还可以返回一个将在局部视图中用于建立下拉列表

[AllowAnonymous]
public virtual PartialViewResult AdvancedSearch()
{
   // The dropdown should return some enumerable list, like IEnumerable<MyModel>
    var dropdown = new Heelp.Helpers.PTDistrictHelpers();

    return PartialView("_MyPartialViewWithDropDownList", dropdown);
}

这应该足以让您重用下拉列表。这样,您就不会在控制器中执行视图的工作。控制器应该返回模型,视图应该进行渲染。

您好,谢谢,但是您没有从类PTDistrictHelpers调用方法DropDownList?如果您希望将来在这个类中有更多的方法,您如何拥有并调用它们呢?关键是您不应该在控制器中使用HTML。另一方面,如果您计划扩展您的控件,那么您应该创建一个新的helper方法来扩展HtmlHelper类。通过这种方式,您可以使用其他选项扩展帮助器。我的AdvancedSearch控制器的方法负责为视图构建模型,不仅是dropdownlist,还负责在下拉列表旁边显示所有需要显示的数据,因此,我在使用和理解项目中的代码时遇到了困难。我的代码旨在解释如何避免在控制器中构建HTML。如果您的模型的任何部分特别是AdvancedSearch生成的集合属性可以用于填充我编写的示例,您可以使用该集合将其传递到部分视图,以建立下拉列表。谢谢,我已将您的问题设置为关于它所呈现的最佳实践的正确问题,对于我以不同的方式解决的问题,我没有一个直接的答案,但是无论如何,谢谢你,我会在将来尝试使用你的代码。
@model IEnumerable<MyModel>

@Html.DropDownList("SomeName", new SelectList(Model, "ValueProperty", "TextProperty"), "Please choose an option", null)