Как я могу получить текстовое поле для просмотра? в моем контроллере - PullRequest
0 голосов
/ 06 февраля 2012

Я следую этому примеру, чтобы установить отношения n к n

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

это работает нормально, но для отношений n к n с полезной нагрузкой в ​​базу данных я выясняю, и я могу сделать[HttpGet] и показать вид, который я хочу показать, но теперь я хочу знать, как я могу получить текстовое поле, которое у меня есть, я могу установить флажок в моем контроллере (см. ниже действие), и это мойпосмотреть, поэтому мой вопрос будет, как можно получить текстовое поле тоже?в моем контроллере для каждого флажка?

@using (Html.BeginForm("AgregarEmpresas", "Empleado"))
{

  <fieldset>
 <div class="editor-field">
    <table>
       <tr>
            @{
                int cnt = 0;
                List<ITCOrganigrama.ViewModel.AsignarEmpresa> empresas = ViewBag.Empresas;

                foreach (var empresa in empresas)
                {
                    if (cnt++ % 5 == 0) {
                        @:  </tr> <tr> 
                    }
                    @: <td> 
                        <input type="checkbox" 
                               name="selectedEmpresa" 
                               value="@empresa.EmpresaId" 
                               @(Html.Raw(empresa.Assigned ? "checked=\"checked\"" : "")) /> 
                          @empresa.Nombre
                      <div>
                            @Html.LabelFor(model => empresa.cargo)
                            @Html.TextBoxFor(model => empresa.cargo, new { style = "width: 150px;" })
                            @Html.ValidationMessageFor(model => empresa.cargo)
                         </div>
                    @:</td>
                }
                @: </tr>
            }
    </table>
</div>
 <p>
            <input type="submit" value="Agregar" />
        </p>
</fieldset>
}

действие, где я получаю чекбокс

 [HttpPost]
        public ActionResult AgregarEmpresas(int? id, FormCollection formCollection, string[] selectedEmpresa)
        {
}

мой окончательный вид: http://s3.subirimagenes.com:81/otros/previo/thump_7406511add1.jpg http://www.subirimagenes.com/otros-add1-7406511.html

Отредактировано:

Класс ViewModel

public class AsignarEmpresa
    {
        public int EmpresaId { get; set; }
        public string Nombre { get; set; }
        public string cargo { get; set; }
        public bool Assigned { get; set; }
    }

1 Ответ

0 голосов
/ 06 февраля 2012

Посмотрите на ваше сообщение и его параметры.Имена тех действительно важны.

Ваши флажки

 <input type="checkbox" 
                           name="selectedEmpresa" 
                           value="@empresa.EmpresaId" 

работают нормально, потому что посмотрите на имя входа, его " selectedEmpresa " это то же имя, что и в Controller Action определение.Связыватель модели ищет это имя в опубликованных данных и, если он его находит, он создает из него объект.В вашем случае он попытается разобрать данные в string [] object.

Итак ... прежде всего вам нужно изменить определение действия на что-то вроде.

[HttpPost]
        public ActionResult AgregarEmpresas(int? id, FormCollection formCollection, string[] selectedEmpresa,string [] empresaTextBox)
        {
}

Затем вы должны изменить сгенерированный html.

@Html.TextBoxFor(model => empresa.cargo, new { style = "width: 150px;", name="empresaTextBox" })

С этими изменениями вы должны получить некоторые данные внутри Action .Однако вы получите что-то странное, потому что у вас есть несколько флажков и текстовых полей , чтобы сообщить связующему модели, что существует несколько элементов из тех, что вам нужно подготовить специальное имя входов, которое содержит номер индекса.

Посмотрите на этот пример

<input name="childs[0]"></input>
<input name="childs[1]"></input>

В этом случае Model Binder создаст массив объектов, который содержит 2 из них.

Итак, наконецВаш код должен выглядеть следующим образом.

@using (Html.BeginForm("AgregarEmpresas", "Empleado"))
{

  <fieldset>
 <div class="editor-field">
    <table>
       <tr>
            @{
                int cnt = 0;
                int i=0;
                List<ITCOrganigrama.ViewModel.AsignarEmpresa> empresas = ViewBag.Empresas;

                foreach (var empresa in empresas)
                {
                    if (cnt++ % 5 == 0) {
                        @:  </tr> <tr> 
                    }
                    @: <td> 
                        <input type="checkbox" 
                               name="selectedEmpresa[@i]" 
                               value="@empresa.EmpresaId" 
                               @(Html.Raw(empresa.Assigned ? "checked=\"checked\"" : "")) /> 
                          @empresa.Nombre
                      <div>
                            @Html.LabelFor(model => empresa.cargo)
                            @Html.TextBoxFor(model => empresa.cargo, new { style = "width: 150px;" ,name=String.Format("empresaTextBox\[{0}\]",i) })
                            @Html.ValidationMessageFor(model => empresa.cargo)
                         </div>
                    @:</td>
                i++;
                }
                @: </tr>

            }
    </table>
</div>
 <p>
            <input type="submit" value="Agregar" />
        </p>
</fieldset>
}

Если вы заставите это работать.Затем я попытался бы создать класс с одним логическим и одним string значением.С этим изменением вы будете работать с массивом классов вместо двух массивов со строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...