2012-02-06 60 views
0

我按照这个例子,使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> 
} 

在那里我得到chekbox行动

[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; } 
    } 

回答

0

看看你的发布行为和它的参数。这些名字非常重要。

你的复选框

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

工作正常怎么一回事,因为看看输入其“selectedEmpresa”这是相同的名称控制器动作定义的名称。模型联编程序在发布的数据中查找此名称,如果他找到它,他会从中创建对象。在你的情况下,他会尝试解析数据到string []对象。

所以......首先你必须将动作定义改成类似的东西。

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

然后你必须改变生成的html。

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

与你应该得到的内部行动一些数据,这些变化。然而,你会得到一些奇怪的,因为你有多个复选框文本框为了告诉模型联编程序,有多个元素,你必须准备包含索引号的输入的特殊名称。

看看这个例子

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

在这种情况下模型绑定将创建包含这些的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> 
} 

如果你会得到这个工作。然后我会尝试创建一个类布尔值和一个字符串值。有了这个改变,你可以在类的数组上操作而不是使用两个带有字符串的数组。

+0

一个在我的行动中,我得到空empresaTextBox 我在我的viewmodel有一个类与布尔和字符串 – 2012-02-06 18:33:03

相关问题