【问题标题】:Passing an instance of a class as an argument to the action/method of Url.Action将类的实例作为参数传递给 Url.Action 的操作/方法
【发布时间】:2020-01-26 01:47:33
【问题描述】:

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

  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:&lt;a href="/ServerList/ExportServerInfo/ProjectName.ViewModels.Server" class=...&gt;

单击按钮时,应调用 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:&lt;a href="/ServerList/ExportServerInfo" class=...&gt;

用户单击按钮(“访问”/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)
  • 你不会那样工作的。如果您只想传递NameRamCapacity,则传递这些具有如下参数的参数:@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


【解决方案1】:

对象不能直接从视图传递到控制器。如果您只有几个属性需要传递,请将它们作为参数传递到类型声明器中。

如果您必须传递整个对象,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);
}

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2015-08-24
    • 2019-03-26
    相关资源
    最近更新 更多