两个不同选项卡(div)中的相同属性。将选项卡2发布到操作方法时,属性为null

时间:2013-08-12 21:16:47

标签: asp.net-mvc

当tab2处于活动状态时,我回发到服务器时{01}在操作方法中为空。当该选项卡处于活动状态时,如何告诉模型绑定器它应该从tab2中取viewModel.FirstName?一切都适用于tab1。

jQuery hide()和show()用于在标签之间切换。

控制器

@Html.EditorFor(m => m.FirstName)

查看

    [HttpPost]
    public ActionResult Index(MyViewModel viewModel)

2 个答案:

答案 0 :(得分:0)

听起来你在同一个表单中有两个FirstName输入字段。

类似的东西:

<form>
  <div id="tab1">
     @Html.EditorFor(m => m.FirstName)
  </div>
  <div id="tab2">
     @Html.EditorFor(m => m.FirstName)
  </div>
</form>

发布时,表单提交为:

FirstName=valueFromField01&FirstName=valueFromField02

从您描述的行为来看,似乎一旦模型绑定器在MyViewModel中设置了FirstName字段,它就会忽略第二个字段(但我对此并不十分肯定)。

解决方案:

  1. 在每个标签内都有一个表单,而不是在其中包含不同标签的表单。这将确保您在表单中只有一个FirstName。
  2. 更新模型,以便获得这两个字段。您需要使用字符串数组:string[] FirstName
  3. <强>更新 您可以更轻松地将另一个参数添加到您的操作方法,而不是更新ViewModel,这样您就可以同时获取FirstName值,然后找出实际提供的值:

    public ActionResult Index(MyViewModel viewModel, string [] FirstName). 
    

    然后,您可以在action方法中使用逻辑来在viewModel中设置FirstName:

    if(!string.IsNullOrEmpty(FirstName[0]))
    {
       viewModel.FirstName = FirstName[0]
    }
    else if(!string.IsNullOrEmpty(FirstName[1]))
    {
       viewModel.FirstName = FirstName[1];
    }
    

答案 1 :(得分:0)

您可以实现禁用重复的名称表单元素。默认情况下,禁用的表单元素将不会传递给请求,并且当Controller显示为活动状态时,您的Controller可能会从tab2接收到corectly的名称。

因此。这是一个例子

$('#tab1')
     .hide()
     .find('input[name="FirstName]"') 
          .prop('disabled',true);

$('#tab2').show()
     .find('input[name="FirstName]"') 
          .prop('disabled',false);

后期我建议您将此行为包含在函数中。

希望它有所帮助。