将 class 的实例作为参数传递给 Url.Action 的 action/method
Passing an instance of a class as an argument to the action/method of Url.Action
我的目标是实现以下目标:
- 在 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 class 中的方法 ExportServerInfo()
,并将选定的 Server
作为唯一参数。取而代之的是,用户被带到 localhost:56789/ServerList/ExportServerInfo/ProjectName.ViewModels.Server
,并出现来自网络服务器的 HTTP 404 错误,因为它找不到它;该字符串本身并不能表明它是哪个服务器。根本不调用该方法。我尝试过的类似解决方案将用户带到一个空白页面,上面的内容作为 URL 中的查询字符串。
当用户单击该按钮时,应该调用该方法,但用户被移动到一个页面(404 错误)并且未调用该方法。
如果action没有argument/parameter:
则执行该方法
<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=...>
用户单击按钮 ("visiting" /ServerList/ExportServerInfo
) 但停留在页面上,方法运行(无参数)。但是该方法必须有一个参数才能将 Server
传回控制器。
此外,由于某种原因,按钮在工作时的外观很好,但突出显示的颜色因实施错误而有点偏差。
tl;dr: 参数未传递给方法,方法从不运行,用户被路由到 404 页面。方法需要传入一个 Server
。
无法将对象直接从视图传递到控制器。如果您只有几个属性需要传递,请将它们作为参数传递到类型声明符中。
如果必须传递整个对象,serialize the object并将其作为字符串参数传递。
<div class="col-md-12" align="right">
<a href="@Url.Action("ExportServerInfo", "ServerList", new { s = Newtonsoft.Json.JsonConvert.SerializeObject(Model.Servers[i] })" class="btn btn-primary">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
@MainResource.SomeLocalizationString
</a>
</div>
调整方法使其接收一个字符串,然后反序列化并存储在对象原始类型的变量中。
public void ExportServerInfo(string s)
{
Server server = Newtonsoft.Json.JsonConvert.DeserializeObject<Server>(s);
// Do something with the Server
System.Diagnostics.Debug.WriteLine(server.Name);
System.Diagnostics.Debug.WriteLine(server.RamCapacity);
}
我的目标是实现以下目标:
- 在 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 class 中的方法 ExportServerInfo()
,并将选定的 Server
作为唯一参数。取而代之的是,用户被带到 localhost:56789/ServerList/ExportServerInfo/ProjectName.ViewModels.Server
,并出现来自网络服务器的 HTTP 404 错误,因为它找不到它;该字符串本身并不能表明它是哪个服务器。根本不调用该方法。我尝试过的类似解决方案将用户带到一个空白页面,上面的内容作为 URL 中的查询字符串。
当用户单击该按钮时,应该调用该方法,但用户被移动到一个页面(404 错误)并且未调用该方法。
如果action没有argument/parameter:
则执行该方法<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=...>
用户单击按钮 ("visiting" /ServerList/ExportServerInfo
) 但停留在页面上,方法运行(无参数)。但是该方法必须有一个参数才能将 Server
传回控制器。
此外,由于某种原因,按钮在工作时的外观很好,但突出显示的颜色因实施错误而有点偏差。
tl;dr: 参数未传递给方法,方法从不运行,用户被路由到 404 页面。方法需要传入一个 Server
。
无法将对象直接从视图传递到控制器。如果您只有几个属性需要传递,请将它们作为参数传递到类型声明符中。
如果必须传递整个对象,serialize the object并将其作为字符串参数传递。
<div class="col-md-12" align="right">
<a href="@Url.Action("ExportServerInfo", "ServerList", new { s = Newtonsoft.Json.JsonConvert.SerializeObject(Model.Servers[i] })" class="btn btn-primary">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
@MainResource.SomeLocalizationString
</a>
</div>
调整方法使其接收一个字符串,然后反序列化并存储在对象原始类型的变量中。
public void ExportServerInfo(string s)
{
Server server = Newtonsoft.Json.JsonConvert.DeserializeObject<Server>(s);
// Do something with the Server
System.Diagnostics.Debug.WriteLine(server.Name);
System.Diagnostics.Debug.WriteLine(server.RamCapacity);
}