MVC - 在@ Html.ActionLink调用中传递对象和字符串

时间:2017-04-11 10:04:24

标签: c# asp.net-mvc

您好我有以下foreach在表中创建行。

_Summary.cshtml

@model KpiSummaryViewModel

...
@foreach (TimeIntervalAndStatus error in Model.MergedErrorTimeIntervals)
   {
      <tr>
         <td style="font-size: small" class="td downTimes">@error.TimeStart</td>
         <td style="font-size: small" class="td downTimes">@error.TimeEnd</td>
         <td style="font-size: small" class="td downTimes">@(error.TimeEnd - 
         error.TimeStart)</td>
         <td style="font-size: small" class="td downTimes">
            @Html.ActionLink("Details", "Index", "Details", error, null)
         </td>
      </tr>
   }

当我单击上面的ActionLink时,我想将错误以及KpiSummaryViewModel.SummaryInformation.Name传递给Details Controller。

我的DetailsController

public class DetailsController : Controller
{
   private TimeIntervalAndStatus _error;
   // GET: Details
   public ActionResult Index(TimeIntervalAndStatus error)
    {
        var detailsViewModel = new DetailsViewModel
        {
            QueryStartDate = error.TimeStart,
            QueryEndDate = error.TimeEnd
        };
        return View(detailsViewModel);
    }
}

我的DetailsViewModel

public class DetailViewModel
{
   [DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
   public DateTime QueryStartDate { get; set; }

   [DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
   public DateTime QueryEndDate { get; set; }

   public TimeSpan DetailDownTimeDuration { get; set; }
}

我的Details.cshtml

@model Foo.Models.DetailViewModel
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Down-time details</title>
    <script type="text/javascript">

    </script>
</head>
<body>
<div>
</div>
</body>
</html>

所以,我需要的是访问Html.ActionLink传递的错误对象,这样我就可以将DetailsViewModel上的字段设置为那些TimeStart,TimeEnd和Duration。然后,我将使用此信息来检索其他信息。这部分有效,但我还需要访问@ Model.SummaryInformation.Name。所以我想传递两件事。

我不想将Name添加到TimeIntervalAndStatus,因为对象具有摘要名称没有意义。

也许我不应该使用@ Html.ActionLink,有更好的方法吗?

我尝试过制作我的ActionLink

@Html.ActionLink("Details", "Index", "Details", new { error, kpiName = Model.SummaryInformation.Name}, null)

然后我的控制器方法变为

public ActionResult Index(TimeIntervalAndStatus error, string kpiName)
{

}

但是错误总是为空。

2 个答案:

答案 0 :(得分:2)

您应该在操作链接中传递错误ID而不是错误对象,因为它会生成Url。因此,请将您的视图更改为

@Html.ActionLink("Details", "Index", "Details", new { errorId = error.Id, kpiName = Model.SummaryInformation.Name}, null)

在您的控制器中,您可以使用错误ID

在操作方法中获取相关的错误对象
public ActionResult Index(int errorId, string kpiName)
{
    // get error object using error id
}

希望能解决你的问题!

答案 1 :(得分:0)

你好像这样做了。但是您的链接应该是

@ Html.ActionLink(“详细信息”,“索引”,“详细信息”,新{错误=错误,kpiName = Model.SummaryInformation.Name},null)

错误=错误需要分配错误值(在for循环中)以使控制器能够接收它。