1

当我在 tab2 处于活动状态时回发到服务器时viewModel.FirstName,action 方法中的值为 null。当该选项卡处于活动状态时,您如何告诉模型绑定器应该@Html.EditorFor(m => m.FirstName)从 tab2 获取?tab1 一切正常。

jQuery hide() 和 show() 用于在选项卡之间切换。

控制器

    [HttpPost]
    public ActionResult Index(MyViewModel viewModel)

看法

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

2 回答 2

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

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

解决方案:

  1. 与其在其中拥有一个包含不同选项卡的表单,不如在每个选项卡内拥有一个表单。这将确保您在表单中只有一个名字。
  2. 更新模型,以便获得这两个字段。您将需要使用一个字符串数组:string[] FirstName

更新: 与其更新您的 ViewModel,不如简单地将另一个参数添加到您的操作方法中,这样您就可以获得两个 FirstName 值,然后找出实际提供了哪个值:

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

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

if(!string.IsNullOrEmpty(FirstName[0]))
{
   viewModel.FirstName = FirstName[0]
}
else if(!string.IsNullOrEmpty(FirstName[1]))
{
   viewModel.FirstName = FirstName[1];
}
于 2013-08-12T21:43:13.850 回答
0

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

所以。下面是一个例子

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

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

后来我建议你应该把这个行为包装在一个函数中。

希望能帮助到你。

于 2013-08-17T16:28:38.273 回答