【问题标题】:Rebinding a list of textboxes in ASP MVC2 VS2010 Beta2 after postback回发后重新绑定 ASP MVC2 VS2010 Beta2 中的文本框列表
【发布时间】:2010-02-02 13:17:40
【问题描述】:

所以.. 我有一个问题。我敢肯定,几乎所有尝试过 MVC 的人都拥有它。尽管如此,我在谷歌上搜索解决方案或为自己想一个解决方案都没有成功。

问题是这样的:我有一个文本框列表,我想一次性编辑这些文本框,我还想在我的列表中添加新项目。但是,第一次回发后文本绑定失败。

所以我做了一个小例子来说明这个问题:

    <% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <% foreach(string s in Model) { %>
        <p>
          <%= Html.TextBox("list",s) %>
        </p>
        <% } %>
        <p>
            <%= Html.TextBox("newstr") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

    <% } %>

控制器代码:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit()
    {
        return View(new List<string>() { "aa", "bb", "cc" });
    }

    // Remove empty strings and add the new one
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(List<string> list, string newstr)
    {
        List<string> res = list.Where(s => !string.IsNullOrWhiteSpace(s)).ToList();

        if (!string.IsNullOrWhiteSpace(newstr))
            res.Add(newstr);

        return View(res);
    }

所以,在第一次 GET 时,我返回 3 个字符串 aa、bb 和 cc,并获得 3 个包含它们的文本的文本框,以及用于新字符串的空文本框,如下所示:

aa
bb
cc
Empty.

现在,如果我清除 bb 字符串并在空文本框中添加“dd”,我会在 newstr 中获得“aa”、“”、“cc”和“dd”的返回列表。这将返回一个新的“aa”、“cc”、“dd”列表,这是我希望在我的复选框中看到的。相反,我得到:

aa
aa
aa
dd (expected empty)

所以.. 我没有得到一些基本的东西:) 为什么它忽略我的新数据模型并使用一些旧的而不是全部?

我想它是从 asp.net 遗留下来的某种视图状态,那么我该如何关闭它呢?我真的很想要广告中的无国籍网页。

【问题讨论】:

    标签: asp.net-mvc data-binding view viewstate c#-4.0


    【解决方案1】:

    如果您查看您的 html 源代码,您会发现这与视图状态无关。在发布后填充输入时,框架将首先搜索发布的值并根据该值填充您的输入。这就是为什么您会在最后一次输入中得到“dd”的原因。在其余输入中获得“aa”的原因是它们都具有相同的名称。您的帖子将如下所示:

    list = "aa", list = "", list = "cc"

    因此,当您呈现名称为“list”的输入时,框架将搜索该帖子并获取第一个匹配的值。每次都是“aa”。这就是为什么你在所有输入中都得到“aa”。您不应有多个具有相同名称的 &lt;input type="text" /&gt;。使用唯一名称,您将解决循环输入的问题。

    我不确定是否有办法让&lt;%=Html.TextBox()%&gt; 不查看发布的数据。但是您可以随时将其更改为普通的&lt;input type="text" name="newstr" /&gt;,这样就可以了。

    【讨论】:

      【解决方案2】:

      有趣的问题。 Html.TextBox() 内部似乎有问题。我调试了您的代码,如您所见,视图中的模型确实包含正确的列表。 (顺便说一句,我在 Visual Studio 2008 中对此进行了测试)。

      当你转换

      <%=Html.TextBox("list", s) %>
      

      达到标准

      <input id="list" name="list" value="<%=s %>" /> 
      

      它的工作方式就像它应该工作一样。这是一个选项吗?

      【讨论】:

      • 是的,它确实有效。 可以解决问题。对于 htmlhelpers 来说就这么多了,至少现在是这样。只要有效,一切都是一种选择。谢谢你们两个:)
      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2011-12-19
      • 2012-08-14
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多