我正在迁移一些代码,并且具有格式良好的查找表,但由于向后兼容性,它们必须转换为陈旧的结构才能使用。我该如何提供部分方法作为可选操作
我有一个GetLookupTable()方法去获取SelectItemList的列表,所有关闭我的模型和查找调用代码生成,但我需要手动改变一些返回SelectItem的,所以我实现了访客模式开发人员可以实现他们的愿望。
访问者是作为一个分部方法进行,如果开发者想要实现就可以了,但我得到一个错误,如下图所示
错误132无法从方法创建委托“InfoChoice.Web.Admin .ViewModels.Product.ProductCreditCardViewModel.LookupTableViewModel.CardTypeVisit(System.Web.Mvc.SelectListItem)”,因为它是没有实现声明
这里的局部的方法是使用剃刀
调用代码下面是一个剥离下来的型号
// Generated model
public partial class ProductCreditCardViewModel
{
[Required]
[DisplayName("Account - Card Type")]
[DefaultValue("")]
public string CardType { get; set; }
// ***************************************************************************************************
// Lookup Table calls for this model (Generated)
// ***************************************************************************************************
public partial class LookupTableViewModel : BaseLookupTableViewModel
{
partial void CardTypeVisit(SelectListItem item);
public SelectList CardType
{
get
{
return GetLookupItems("ProductCreditCardCardType", CardTypeVisit);
}
}
}
}
public partial class ProductCreditCardViewModel
{
// Custom Implementation Goes Here
public partial class LookupTableViewModel : BaseLookupTableViewModel
{
//partial void CardTypeVisit(SelectListItem item)
//{
// item.Value = "|" + item.Value + "|";
//}
}
}
基地LookupTable中视图模型,将返回选择项目列表数据
public class BaseLookupTableViewModel
{
public SelectList GetLookupItems(string lookupName)
{
return GetLookupItems(lookupName, "Name", "Text", null, null);
}
public SelectList GetLookupItems(string lookupName, Action<SelectListItem> itemVisitor)
{
return GetLookupItems(lookupName, "Name", "Text", null, itemVisitor);
}
public SelectList GetLookupItems(string lookupName, string dataValueField, string dataTextField, object selectedValue, Action<SelectListItem> itemVisitor)
{
// Go get some data from DataStore
var list = App.Data.Lookup.GetLookupList(lookupName);
// Convert to IEnumerable<SelectItemList>
var result = new SelectList(list, dataValueField, dataTextField, selectedValue);
// If developer would like to alter that list before it is returned, then developer should implement an item visitor
if (itemVisitor != null)
{
foreach (var item in result)
{
itemVisitor(item);
}
}
return result;
}
public void SampleVisitor(SelectListItem item)
{
item.Value = "Modified: " + item.Value;
}
}
这似乎正是我要找的:return GetLookupItems(“ProductCreditCardCardType”,x => CardTypeVisit(x)); –
foreach(var item in result) { //此访问者将执行以下操作:item.Value =“|” + item.Value +“|”; itemVisitor(item); LogUtil.Info(item.Value); } foreach(var item in result) { LogUtil.Info(item.Value); } 此代码不会更新结果。即在第一环路中,我获得以下(| Visa |,| Mastercard |,| AMEX |),但是在第二环路中(Visa,Mastercard,AMEX)。我会认为项目是一个引用类型,并会更新SelectItemList,但它似乎是一个副本。 –