0

作为 ASP MVC 的新手,我遇到了以下问题。

我的页面上有一个“重复”控件列表,由以下 Razor 代码提供:

@model BankBLL.Interfaces.ISecureFolder

...(some irrelevant code here)

<header><h3 >Commitee list</h3></header>
@foreach (var commitee in Model.Commitees)
{
    <a href="@Url.Action("CommiteePage", "SecureFolder", commitee)">
        <div class="commiteeButtonImageContainer">@commitee.Name</div>
        <img src="~/Images/CommiteeButtonImage.png"/>
    </a>
}

此处的 Model.Commitees 是 ICommitee 对象的列表,这意味着我正在尝试将每个 Url.Action “绑定”到相应的 ICommitee commitee 对象。但是,当涉及到我的控制器操作时:

public ActionResult CommiteePage(ICommitee commitee)
{
    return View("CommiteePage", commitee);
}

看起来我把它弄错了,因为应用程序返回“无法创建接口的实例”。错误,这意味着单击操作链接时应用程序无法检索所需的委员会对象。

有没有办法将每一行“item datacontext”(在这种情况下为 ICommitee 对象)绑定到对应的 Url.Action?

4

2 回答 2

1

不幸的是,由于声誉规定,无法提前发布。

由于很好的解释,终于解决了这个问题: HTML.ActionLink 方法

当您尝试从 Url.Action 或 Html.ActionLink 传递参数时 - 您必须明确指定负责 html 参数的最终“null”参数。

在我的情况下,以下代码可以正常工作:

稍微改变了控制器动作(现在只接收名称而不是委员会对象本身)

public ActionResult CommiteePage(string commiteeName)
{ 
    return View("CommiteePage", SecureFolder.Commitees.First(o=>o.Name == commiteeName));
}

并更改了调用此操作的 html 的语法:

@foreach (var commitee in Model.Commitees)
{
    <a href="@Url.Action("CommiteePage", "SecureFolder", new { commiteeName=commitee.Name }, null)">
        <div class="commiteeButtonImageContainer">@commitee.Name</div>
        <img src="~/Images/CommiteeButtonImage.png"/>
    </a>
}

现在视图正确地将选定的委员会的名称传递给控制器​​,以便我可以重定向到相应的委员会视图。

感谢大家帮助解决这个问题!

于 2013-07-31T06:43:11.763 回答
0

主要问题是默认模型绑定器无法创建接口的实例。尝试更具体,即public ActionResult CommiteePage(ImplementedCommiteeType commitee). 您还可以创建一个可以CommiteeViewModel: ICommitee在其中传输结构的类(仅在控制器和视图中)。

或者您可以创建自己的模型绑定器,它知道要实现什么。这稍微复杂一些。

于 2013-07-30T13:17:37.137 回答