将 class 的实例作为参数传递给 Url.Action 的 action/method

Passing an instance of a class as an argument to the action/method of Url.Action

我的目标是实现以下目标:

  1. 在 ASP.NET 页面上,用户从 Server 个对象列表中选择一个服务器。
  2. 用户单击按钮导出有关该服务器的信息。
  3. 单击该按钮会执行 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);
}