【发布时间】:2020-01-26 01:47:33
【问题描述】:
我的目标是实现以下目标:
- 在 ASP.NET 页面上,用户从
Server对象列表中选择一个服务器。 - 用户单击按钮以导出有关该服务器的信息。
- 单击该按钮会执行一个 C# 方法
ExportServerInfo(),并将当前的Server对象 (Model.Servers[i]) 传递给它。
控制器有方法:
public void ExportServerInfo(Server id)
{
// Do something with the Server
System.Diagnostics.Debug.WriteLine(id.Name);
System.Diagnostics.Debug.WriteLine(id.RamCapacity);
}
视图是使用 Razor 的 CSHTML 文件。这是按钮的代码:
<div class="col-md-12" align="right">
<a href="@Url.Action("ExportServerInfo", "ServerList", new { id = Model.Servers[i] })" class="btn btn-primary">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
@MainResource.SomeLocalizationString
</a>
</div>
生成的 HTML:<a href="/ServerList/ExportServerInfo/ProjectName.ViewModels.Server" class=...>
单击按钮时,应调用 ServerListController 类中的方法ExportServerInfo(),并将选定的Server 作为唯一参数。相反,用户被带到localhost:56789/ServerList/ExportServerInfo/ProjectName.ViewModels.Server,来自网络服务器的 HTTP 404 错误,因为它找不到它;该字符串本身并不表示它是哪个服务器。该方法根本没有被调用。我尝试的类似解决方案将用户带到一个空白页面,并将上述内容作为 URL 中的查询字符串。
当用户点击按钮时,该方法应该被调用,但是,用户被移动到一个页面(404s)并且该方法没有被调用。
如果动作没有参数/参数,则执行该方法:
<div class="col-md-12" align="right">
<a href="@Url.Action("ExportServerInfo", "ServerList")" class="btn btn-primary">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
@MainResource.SomeLocalizationString
</a>
</div>
生成的 HTML:<a href="/ServerList/ExportServerInfo" class=...>
用户单击按钮(“访问”/ServerList/ExportServerInfo)但停留在页面上,并且方法运行(没有参数)。但是该方法必须有一个参数才能将Server 传递回控制器。
此外,出于某种原因,按钮的外观在工作时还不错,但由于实施错误,突出显示颜色有点偏离。
tl;dr: 参数没有传递给方法,方法永远不会运行,用户被路由到 404 页面。方法需要一个 Server 传递给它。
【问题讨论】:
-
@RyanWilson 哎呀!固定。
-
您的
Url.Action似乎需要更新。您有一个id参数,但您传递的是整个模型,而不仅仅是一个 id。也许试试这个:@Url.Action("ExportServerInfo", "ServerList", new { id = Model.Servers[i].Id }) -
应该传递整个
Server,因为 ExportServerInfo 必须读取。服务器没有id变量;我认为这只是路由的默认设置。如果您有多个参数,不确定您应该做什么,但否则什么也不会发生;我尝试将其作为new { server = Model.Servers[i] })传递并创建方法ExportServerInfo (Server server)。 -
你不会那样工作的。如果您只想传递
Name和RamCapacity,则传递这些具有如下参数的参数:@Url.Action("ExportServerInfo", "ServerList", new { name = Model.Servers[i].Name, ram =Model.Servers[i].RamCapacity }),然后更新您的操作以接受这些参数:public void ExportServerInfo(string name, string ram)。只有在您发布表单值时才会这样工作,然后 MVC 模型绑定器会将发布的值映射到您的Server模型。 -
@ErikHumphrey 另一种选择是序列化对象并将其作为 JSON 字符串传递给您的控制器,然后在控制器中将其反序列化为服务器类对象。
标签: c# asp.net asp.net-mvc razor url-routing