Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多控制器通用方法_C#_Asp.net Mvc 3_Methods_Asp.net Mvc Controller - Fatal编程技术网

C# 多控制器通用方法

C# 多控制器通用方法,c#,asp.net-mvc-3,methods,asp.net-mvc-controller,C#,Asp.net Mvc 3,Methods,Asp.net Mvc Controller,我在多个控制器中有一个通用的方法,而不是所有控制器。将该方法放在控制器基中并且所有其他控制器继承它是否正确 public class BaseController : Controller { public IEnumerable<SelectListItem> GetStatus() { IList<SelectListItem> status = new List<SelectListItem>(); st

我在多个控制器中有一个通用的方法,而不是所有控制器。将该方法放在控制器基中并且所有其他控制器继承它是否正确

public class BaseController : Controller
{
    public IEnumerable<SelectListItem> GetStatus()
    {
        IList<SelectListItem> status = new List<SelectListItem>();

        status.Add(new SelectListItem() { Text = "Select", Value = "" });

        Enum.GetValues(typeof(Status)).Cast<Status>().ToList().Select(x => new SelectListItem()
        {
            Text = x.ToString(),
            Value = ((byte)x).ToString()
        }).ToList().ForEach(status.Add);

        return status;
    }
}

public class DownloadController : BaseController
{
    public ActionResult New()
    {
        NewViewModel newViewModel = new NewViewModel();

        newViewModel.Status = GetStatus();

        return View(newViewModel);
    }
}
公共类BaseController:控制器
{
公共IEnumerable GetStatus()
{
IList status=新列表();
添加(新建SelectListItem(){Text=“Select”,Value=”“});
Enum.GetValues(typeof(Status)).Cast().ToList().Select(x=>newselectListItem())
{
Text=x.ToString(),
值=((字节)x).ToString()
}).ToList().ForEach(status.Add);
返回状态;
}
}
公共类DownloadController:BaseController
{
公共行动结果新()
{
NewViewModel NewViewModel=新的NewViewModel();
newViewModel.Status=GetStatus();
返回视图(newViewModel);
}
}

我倾向于组合而不是继承,并将代码封装在另一个对象中,然后将该对象注入控制器。尤其是在这种情况下


在这种情况下,设置枚举列表的呈现可能更适合于部分控制器/视图。

我更喜欢组合而不是继承,并将代码封装在另一个对象中,然后将该对象注入控制器。尤其是在这种情况下


在这种情况下,设置枚举列表的呈现可能更适合部分控制器/视图。

这似乎是正确的,您可能会将其设置为静态和受保护。

这似乎是正确的,您可能会将其设置为静态和受保护。

我实际上会采取不同的方法。为此,我使用了一些自定义HTML帮助程序,如下所示:

这样,您就可以使用:

 <%: Html.EnumDropDownListFor(model => model.EnuProperty) %>
model.property)%%>
我更喜欢Simon提交的答案,它允许您使用Meta Description属性自定义枚举名称的输出:


我实际上会采取不同的方法。为此,我使用了一些自定义HTML帮助程序,如下所示:

这样,您就可以使用:

 <%: Html.EnumDropDownListFor(model => model.EnuProperty) %>
model.property)%%>
我更喜欢Simon提交的答案,它允许您使用Meta Description属性自定义枚举名称的输出:

基于这一行

newViewModel.Status = GetStatus();
我认为getStatus不应该是控制器上的一个方法。控制器应处理Http请求并返回Http响应。这些响应可以是文件、视图、json等。。。但看起来这并不是您使用GetStatus的方式,也不打算将其作为Http响应返回。如果情况确实如此,它应该去其他地方

我的MVC应用程序总是有一个服务层来提供视图模型。因此,在我的应用程序中,该服务层将服务器化状态。

基于这一行

newViewModel.Status = GetStatus();
我认为getStatus不应该是控制器上的一个方法。控制器应处理Http请求并返回Http响应。这些响应可以是文件、视图、json等。。。但看起来这并不是您使用GetStatus的方式,也不打算将其作为Http响应返回。如果情况确实如此,它应该去其他地方


我的MVC应用程序总是有一个服务层来提供视图模型。因此,在我的应用程序中,这个服务层将为状态提供服务器。

如果您共享了ActionResults,我会说在基类中这样做是可以的。如果你想共享一个属性或对象,比如一个状态列表,把它放在一个公共类中,然后用这种方式访问它。是的,我也这样做。这可能取决于你用它做什么。如果你有共享的ActionResults,我会说在基类中这样做是可以的。如果你想共享一个属性或对象,比如一个状态列表,把它放在一个公共类中,然后用这种方式访问它。是的,我也这样做。这可能取决于你在用它做什么。我在这里发现了一些东西。我理解受保护的
带来了什么,但是
静态的
在这里有什么用处呢?静态意味着您可以访问属性而不创建对象的实例。@tugberk因为您的方法似乎不使用任何成员数据,它实际上是静态的-它不依赖于实例,但是只有在参数和其他静态数据(在您的acse中,围绕状态类/枚举的类型系统中)@tugberk重构为静态,并且看到它完全依赖于另一个类型,与控制器完全无关,那么也表明它可能不应该也是控制器的一部分。我理解受保护的
带来了什么,但是
静态的
在这里有什么用处呢?静态意味着您可以访问属性而不创建对象的实例。@tugberk因为您的方法似乎不使用任何成员数据,它实际上是静态的-它不依赖于实例,但是只有在参数和其他静态数据(在您的acse中,围绕状态类/枚举的类型系统中)@tugberk重构为静态,并且看到它完全依赖于另一个类型,与控制器完全无关,那么也会向您显示,它可能不应该也是控制器的一部分。