0
私のビューのドロップダウンリストとして、自分のasp.net MVCアプリケーションで私のモデルから列挙型を表示するヘルパーメソッドを書きました。今、私はasp.net mvcドロップダウンリストの値を選択した値オーバーライダーの問題
public static MvcHtmlString EnumDropDownList<TEnum>(this HtmlHelper htmlHelper,
object enumObj,
string name,
string defaultItemKey,
bool sortAlphabetically,
object firstValueOverride,
object htmlAttributes)
where TEnum : struct
{
return htmlHelper.DropDownList(name,
CreateSelectItemList<TEnum>(enumObj,
defaultItemKey,
sortAlphabetically,
firstValueOverride),
htmlAttributes);
}
:
public static List<SelectListItem> ToSelectList<T>(
this IEnumerable<T> enumerable,
Func<T, string> text,
Func<T, string> value,
string defaultOption,
object selectedVal,
bool sortAlphabetically,
object FirstValueOverride)
{
int iSelectedVal = -1;
if(selectedVal!=null)
{
try
{
iSelectedVal = Convert.ToInt32(selectedVal);
}
catch
{
}
}
var items = enumerable.Select(f => new SelectListItem()
{
Text = text(f),
Value = value(f),
Selected = (iSelectedVal > -1)? (iSelectedVal.ToString().Equals(value(f))) : false
});
#region Sortare alfabetica
if (sortAlphabetically)
items = items.OrderBy(t => t.Text);
#endregion Sortare alfabetica
var itemsList = items.ToList();
Func<SelectListItem, bool> funct = null;
string sValue = string.Empty;
SelectListItem firstItem = null;
SelectListItem overridenItem = null;
int overridenIndex = 0;
if (FirstValueOverride != null)
{
sValue = FirstValueOverride.ToString();
funct = (t => t.Value == sValue);
overridenItem = itemsList.SingleOrDefault(funct);
overridenIndex = itemsList.IndexOf(overridenItem);
if (overridenItem != null)
{
firstItem = itemsList.ElementAt(0);
itemsList[0] = overridenItem;
itemsList[overridenIndex] = firstItem;
}
}
if(!string.IsNullOrEmpty(defaultOption))
itemsList.Insert(0, new SelectListItem()
{
Text = defaultOption,
Value = "-1"
});
return itemsList;
}
これらは私が呼び出すメソッドです:これは、実際に選択項目のリストを生成し
public static List<SelectListItem> CreateSelectItemList<TEnum>(object enumObj,
string defaultItemKey,
bool sortAlphabetically,
object firstValueOverride)
where TEnum : struct
{
var values = (from v in (TEnum[])Enum.GetValues(typeof(TEnum))
select new
{
Id = Convert.ToInt32(v),
Name = ResourceHelpers.GetResourceValue(AppConstants.EnumResourceNamespace,
typeof(TEnum).Name, v.ToString())
});
return values.ToSelectList(e => e.Name,
e => e.Id.ToString(),
!string.IsNullOrEmpty(defaultItemKey) ? ResourceHelpers.GetResourceValue(AppConstants.EnumResourceNamespace, defaultItemKey) : string.Empty,
enumObj,
sortAlphabetically,
firstValueOverride);
}
:ここ
はそのために私のコードです記載された問題を有する here私はこのヘルパーメソッドを呼び出し、入力の名前は選択された値が選択されないプロパティの名前と同じです。
そこに記載されている代替の解決策は私のためには機能しません。唯一の解決策は、名前を変更し、代わりにFormCollectionを使用してモデルバインドを使用しないことです。 ViewModelパターンを使用して検証を使用することができず、すべての列挙に対して追加のコードを記述する必要があるため、この回避策が嫌いです。
これをどうにかして補うためにカスタムモデルのバインダーを書きましたが、アクションを開始するときにそこでオーバーライドできるメソッドはありません。
FormCollectionを使用せずにこれを行う方法はありますか? 入力フィールドに値を入力して正しい値を選択しようとすると、何とかASP.NET MVCをインターセプトできますか?
ありがとうございます。
MvcHtmlString(String)コンストラクタは廃止されました。代わりにMvcHtmlString.Create(String)を使用してください。 – OneDeveloper