C# 什么';我想在多个动作中引用相同的重复代码,这是最有效的方法吗?
我正在努力使控制器的操作更有效。假设我有两个操作,一个是ViewResult,另一个是PartialViewResult。两个操作都在同一viewModel中返回的某个点执行相同的操作,假设我的两个操作是: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
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才是真正的出路。。。