C# 什么';我想在多个动作中引用相同的重复代码,这是最有效的方法吗?

C# 什么';我想在多个动作中引用相同的重复代码,这是最有效的方法吗?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我正在努力使控制器的操作更有效。假设我有两个操作,一个是ViewResult,另一个是PartialViewResult。两个操作都在同一viewModel中返回的某个点执行相同的操作,假设我的两个操作是: public ViewResult datastream(string dataID) { var data = db.data.FirstOrDefault(i -> i.ID == dataID); var viewModel = new DataViewModel

我正在努力使控制器的操作更有效。假设我有两个操作,一个是ViewResult,另一个是PartialViewResult。两个操作都在同一viewModel中返回的某个点执行相同的操作,假设我的两个操作是:

public ViewResult datastream(string dataID)
{
    var data = db.data.FirstOrDefault(i -> i.ID == dataID);
    var viewModel = new DataViewModel();
    viewModel.Data = data.Data;
    return view(viewModel)
}

public PartialViewResult datastreampartial(string dataID)
{
    var data = db.data.FirstOrDefault(i -> i.ID == dataID);
    var viewModel = new DataViewModel();
    viewModel.Data = data.Data;
    return PartialView("_datapartial", viewModel)
}
我可以说:

var data = db.data.FirstOrDefault(i -> i.ID == ID)

var viewModel = new DataViewModel();

viewModel.Data = data.Data;
编码到另一个动作中,然后重定向到包含viewModel的原始动作,然后我可以根据viewModel是否为null,使这两个原始动作以适当的方式动作。不过,这似乎有点滑稽。想必有某种方法可以很容易地引用这段代码,这样它就可以很容易地用于两个操作以及两个操作返回的viewModel


做到这一点的最佳方法是什么?

CPU周期方面的效率在这里没有多大区别,因此您应该选择最可读的方法,尽可能多地共享代码

基于
ID
生成获取
DataViewModel
的助手方法是一种经典方法,在命令式语言中可用:

private static DataViewModel GetViewModel(string dataID) {
    // You can flatten your three lines into one with {} initialization syntax
    return new DataViewModel {
        Data = db.data.FirstOrDefault(i -> i.ID == dataID)
    };
}
现在,您可以用一行代码在所有操作中使用您的方法:

return view(GetViewModel(dataID))
...
return PartialView("_datapartial", GetViewModel(dataID))

CPU周期方面的效率在这里并没有多大区别,所以您应该选择最可读的方法,尽可能多地共享代码

基于
ID
生成获取
DataViewModel
的助手方法是一种经典方法,在命令式语言中可用:

private static DataViewModel GetViewModel(string dataID) {
    // You can flatten your three lines into one with {} initialization syntax
    return new DataViewModel {
        Data = db.data.FirstOrDefault(i -> i.ID == dataID)
    };
}
现在,您可以用一行代码在所有操作中使用您的方法:

return view(GetViewModel(dataID))
...
return PartialView("_datapartial", GetViewModel(dataID))

只需在控制器上创建一个私有方法,并从您的操作中调用它。没有理由调用RedirectToAction

private WhateverYouTypeIs GetData(int Id)
{
    var data = db.data.FirstOrDefault(i -> i.ID == ID)

    var viewModel = new DataViewModel { Data = data.Data);

    return viewModel;
}
然后改变你的方法

public ViewResult datastream(string dataID)
{
    return view(GetData(dataID));
}

public PartialViewResult datastreampartial(string dataID)
{
    return PartialView("_datapartial", GetData(dataID));
}

只需在控制器上创建一个私有方法,并从您的操作中调用它。没有理由调用RedirectToAction

private WhateverYouTypeIs GetData(int Id)
{
    var data = db.data.FirstOrDefault(i -> i.ID == ID)

    var viewModel = new DataViewModel { Data = data.Data);

    return viewModel;
}
然后改变你的方法

public ViewResult datastream(string dataID)
{
    return view(GetData(dataID));
}

public PartialViewResult datastreampartial(string dataID)
{
    return PartialView("_datapartial", GetData(dataID));
}

您可以创建一个私有方法,该方法返回两个公共方法所使用的对象:

public ViewResult datastream(string dataID)
{
    return view(this.GetDataViewModel(dataID));
}

public PartialViewResult datastreampartial(string dataID)
{
    return PartialView("_datapartial", this.GetDataViewModel(dataID))
}

private DataViewModel GetDataViewModel(string dataId)
{
    var data = db.data.FirstOrDefault(i => i.ID == dataID);
    var viewModel = new DataViewModel()
    {
        Data = data?.Data;
    }

    return viewModel;
}

请记住,当您试图访问
数据时,代码可能会引发异常。数据
,而不检查它是否为
null
值;“我的私有方法”中没有问题。

您可以创建一个私有方法,该方法返回两个公共方法所使用的对象:

public ViewResult datastream(string dataID)
{
    return view(this.GetDataViewModel(dataID));
}

public PartialViewResult datastreampartial(string dataID)
{
    return PartialView("_datapartial", this.GetDataViewModel(dataID))
}

private DataViewModel GetDataViewModel(string dataId)
{
    var data = db.data.FirstOrDefault(i => i.ID == dataID);
    var viewModel = new DataViewModel()
    {
        Data = data?.Data;
    }

    return viewModel;
}

请记住,当您试图访问
数据时,代码可能会引发异常。数据
,而不检查它是否为
null
值;在我的私有方法中没有问题。

您正在寻找的是所谓的n层。本质上,每一层都负责自己的职责——因此您的控制器不应该直接(或通过EF)与数据库交互,而是通过服务/业务层进行交互。这是一个很好的开始——尽管答案给了你一个直接的答案——n-tier才是真正的出路……你所寻找的被称为n-tier。本质上,每一层都负责自己的职责——因此您的控制器不应该直接(或通过EF)与数据库交互,而是通过服务/业务层进行交互。这是一个好的开始-虽然答案给你一个直接的答案-n-tier才是真正的出路。。。