我正在尝试实现这样的事情:

<div>
    <table>
        <thead>
            <tr>
                <td>Port name</td>
                <td>Current port version</td>
                <td>New port version</td>
                <td>Update</td>
            </tr>
        </thead>
        <% foreach (var ip in Ports) { %>
            <tr>
                <td>
                    <%= ip.PortName %>
                </td>
                <td>
                    <%= ip.CurrentVersion %>
                </td>
                <td>
                    <%= ip.NewVersion %>
                </td>
                <td>
                    <asp:Button ID="btnUpdate" runat="server" Text="Update" CommandArgument="<% ip.PortName %>" />
                </td>
            </tr>
            <% } %>
    </table>
</div>

按钮的 CommandArgument 属性是我的代码抱怨无法解析符号的地方 ip. 。有什么办法可以做我想做的事吗?­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

有帮助吗?

解决方案

您不想在 ASP.NET MVC 中使用 Webforms 按钮。MVC 是一种完全不同的工作方式,您不再拥有 WebForms 抽象。

您有 2 个不同的选项,您可以用输入标记替换 asp:Button 或使用标准超链接。如果您使用输入选项,那么您将需要包装在表单元素中。表单操作应指向控制器操作。

其他提示

您不能以简单的方式在 ASP.NET MVC 中使用 Webform 控件,因为它们依赖于 MVC 中剥离的内容。相反,您可以通过两种方式添加按钮,都使用 HtmlHelperViewPage:

您可以在表单中添加一个按钮,如果每个按钮都有一个表单,则可以在控制器中轻松处理该按钮:

<% using(Html.BeginForm("Update", "Ip", new {portName = ip.PortName} )) { %>

    ....
    <input name="action" type="submit" value="Update">

<% } %>

BeginForm() 将默认使用与创建视图相同的控制器和操作。另一种方法是添加一个链接,这更适合您迭代列表的示例。例如,假设您有 IpController

<%= Html.ActionLink("Update IP", "Update", "Ip", 
        new { 
            portName = ip.PortName 
        }) 
%>

该链接将转到 IpController 中的更新操作,并以给定的 portName 作为参数。在这两种情况下,您都需要在 IpController 中执行此操作:

public ActionResult Update(string portName) {
    // ...
}

希望这可以帮助。

我认为你必须将你的块包含在表单标签和 runat=server 中。

FWIW,

我认为这段文字缺少一个等号:

CommandArgument="<% ip.PortName %>"

应该

CommandArgument="<%= ip.PortName %>"

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top