Я разделил этот вопрос на 4 части: 1. Фон 2. Моя проблема 3. Как я это решил 4. К какому решению я на самом деле стремлюсь
1. Фон Я использую Visual Studio 2019 и ASP. NET MVC для создания веб-приложения. В ASP MVC входные переменные могут быть добавлены непосредственно в custom_objects
/ custom_objects_array
/ Dictionary<string,custom_objects>
, если <input>
имеет name
в определенном шаблоне.
Примеры: здесь есть 3 примера: Пример A: значения form>input
s отображаются на CustomObject
Пример B: значения form>input
s отображаются на CustomObject[]
, т.е. массив CustomObject Пример C: form>input
s значения отображаются на Dictionary<string,CustomObject>
Пример A : form>input
s значения отображаются на CustomObject
MyForm.cs html: (другие теги избегают, чтобы код был коротким)
<form action='MyAction' moehtod='post'>
<input name='mypage.rowid'/>
<input name='mypage.path' />
<input type='submit' />
</form>
class MyPage.cs: (закрывающие скобки избегают, чтобы код был коротким)
namepace ABC
{ public class MyPage
{ public string rowid{get;set;}
public string path{get;set;}
класс MyController.cs: (закрывающие скобки избегают, чтобы код был коротким) Пример B : значения form>input
s отображаются на CustomObject[]
, т.е. массив CustomObject-MyForm.cs html:
<input name='mypages[0].rowid'/>
<input name='mypages[0].path' />
<input name='mypages[1].rowid'/>
<input name='mypages[1].path' />
класс MyPage.cs: как в примере выше class MyController.cs: (Закрывающие фигурные скобки и другой тривиальный код избегают краткости кода)
{ public ActionResult MyAction(MyPage[]mypages)
{ //other code
Пример C: * значения 1053 * s отображаются на Dictionary<string,CustomObject>
MyForm.cs html: как в примере выше класс MyPage.cs: как в примере выше class MyController.cs: (Закрывающие фигурные скобки и другой тривиальный код избегают краткости кода)
{ public ActionResult MyAction(Dictionary<string,MyPage>mypages)
{ /* Key-Value pairs in this dictionary, look like this:
"0" -> MyPage{rowid:"...",path:"..."}
"1" -> MyPage{rowid:"...",path:"..."} */
2. Моя проблема:
Проблема 1 : Если я использую массив на стороне сервера, то есть MyAction(MyPage[]mypages)
, то индексы в input name=mypage[<index>]
(замените <index>
здесь индексным номером) должны начинаться с 0
, а нумерация должна быть непрерывным Это означает, что если существует 4 набора входов, то индексы должны быть 0,1,2,3. И если я пропущу число 3, и я нумерую индексы как 0,1,2,4; тогда массив будет иметь только 3 объекта с индексами 0,1,2, но не 3 или 4. И если я начну индекс массива с 1 (или любое число больше 0), то массив будет иметь 0 объектов (пустой массив) .
Проблема 2 : Если я использую ...MyAction(Dictionary<string,MyPage>...
, мне не нужно начинать с 0
, и я также могу пропустить промежуточные числа. Но когда я использую ...MyAction(Dictionary<int,MyPage>...
, словарь оказывается пустым.
3. Как я это решил: Я создал метод, который преобразует Dictionary<string,V>
в Dictionary<int,V>
, и вызвал его в первой строке MyController.MyAction
. Вот этот метод: (Закрывающие фигурные скобки и другой тривиальный код избегают короткого кода)
public static class MapUtl
{ public static Dictionary<int,V> ToIntKeys<V>(this Dictionary<string,V>strKeyDct)
{ Dictionary<int, V> newDct = new Dictionary<int, V>();
foreach(KeyValuePair<string, V> kv0 in strKeyDct)
{
int newKey = Convert.ToInt32(kv0.Key);
newDct.Add(newKey, kv0.Value);
}
return newDct;
Вызов моего пользовательского метода: (Закрывающие фигурные скобки и другой простой код избегают короткого кода)
{ public ActionResult MyAction(Dictionary<string,MyPage>mypages)
{ Dictionary<int,MyPage>mypagemap = mypages.ToIntKeys();
4. Какое решение я на самом деле нацеливаю: Я хочу использовать это:
{ public ActionResult MyAction(Dictionary<int,MyPage>mypages)//taking inputs in int-key dictionary
, а не это:
{ public ActionResult MyAction(Dictionary<string,MyPage>mypages)//taking inputs in string-key dictionary
{ Dictionary<int,MyPage>mypagemap = mypages.ToIntKeys();//converting string-key dictionary to int-key dictionary
, чтобы мне не пришлось быть особенно осторожным во время программирования добавьте еще 1 строку, и мой код станет более интуитивно понятным.
Есть ли способ избежать вызова Dictionary<int,MyPage>mypagemap = mypages.ToIntKeys();
?