Размещение списка форм-входов непосредственно в словарь по представлению - PullRequest
0 голосов
/ 11 марта 2020

Я разделил этот вопрос на 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();?

...