通过Action Link传递整个对象

时间:2015-03-06 16:27:25

标签: asp.net-mvc

是否可以将整个对象从我的视图传递给控制器​​。在我的每个地址都按预期填充,但我正在努力将这个完整的对象传回我的控制器方法“EditPlusNewAddress”。

@if (Model.Count() > 0)
    {
        <table border="1" cellpadding="1">
            @foreach (var address in Model)
            {
                <tr>
                    <td>@address.postcode</td>
                    <td>@address.lat</td>
                    <td>@address.lng</td>
                    <td>@address.thorofare</td>
                    <td>@address.dthorofare</td>
                    <td>@address.county</td>
                    <td>@address.paon</td>
                    <td>@address.saon</td>
                    <td>@address.posttown</td>
                    <td>@address.uprn</td>   
                    <td>@Html.ActionLink("Select Address", "EditPlusNewAddress", new { evpId = 11}, new JsonAddressModel{ county = address.county,
                                                                                                                          dthorofare = address.dthorofare,
                                                                                                                          ExtensionData = address.ExtensionData,
                                                                                                                          lat = address.lat,
                                                                                                                          lng = address.lng,
                                                                                                                          paon = address.paon,
                                                                                                                          postcode = address.postcode,
                                                                                                                          posttown = address.posttown,
                                                                                                                          saon = address.saon,
                                                                                                                          thorofare = address.thorofare,
                                                                                                                           uprn = address.uprn}, null)</td>             
                </tr>
            }
        </table>
    }

我收到以下错误:

  

错误2参数4:无法从'AnonymousType#1'转换为'string'

     

错误3参数5:无法转换   'Solution.Core.AddressService.JsonAddressModel'到   'System.Web.Routing.RouteValueDictionary'

     

错误1'System.Web.Mvc.HtmlHelper&gt;'   不包含'ActionLink'的定义和最佳扩展名   方法过载   “System.Web.Mvc.Html.LinkExtensions.ActionLink(System.Web.Mvc.HtmlHelper,   string,string,string,System.Web.Routing.RouteValueDictionary,   System.Collections.Generic.IDictionary)'有一些   无效的参数

1 个答案:

答案 0 :(得分:1)

我们不会从视图中传回对象,我们传递名称:值组合并从服务器上构建模型:

在这种情况下,您只需在控制器上执行[HttpGet]操作即可接受JsonAddressModel参数

[HttpGet]
public ActionResult EditPlusNewAddress(JsonAddressModel model)
{
    ....
}

然后在您的视图中传递您要使用的值。在这里,错误消息应该为您提供线索,因为您只是使用了错误类型的对象... JsonAddressModel而不是RouteValueDictionary

这是因为你在ActionLink定义中占据了一个位置。因此,假设evpId是您JsonAddressModel的标识符,它应该是:

@Html.ActionLink("Select Address", "EditPlusNewAddress",
                         new { evpId = 11 ,
                             county = address.county,
                             dthorofare = address.dthorofare,
                             ExtensionData = address.ExtensionData,
                             lat = address.lat,
                             lng = address.lng,
                             paon = address.paon,
                             postcode = address.postcode,
                             posttown = address.posttown,
                             saon = address.saon,
                             thorofare = address.thorofare,
                             uprn = address.uprn
                         })

这就是你如何建立一个看起来像的网址:

/Controller/EditPlusNewAddress?evpId=11&county=burbank&dthorofare=abc&......

模型绑定器足够智能,可以获取查询字符串并从中构建JsonAddressModel。这就是 传递复杂网址以共享搜索过滤器等的方式。

然而问题是GET应该是幂等操作。虽然你正在调用你的动作“EditPlusNewAddress”,听起来你想要改变某些服务器端,为此,良好的做法要求你应该创建一个表单并POSTing回来。

GET链接可以改变恶意软件,邪恶行为者和/或无能的东西。