首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ASP.NET MVC - Html.ActionLink routeValues中的故障传递模型

ASP.NET MVC - Html.ActionLink routeValues中的故障传递模型
EN

Stack Overflow用户
提问于 2010-11-17 02:48:40
回答 6查看 31.3K关注 0票数 13

我的视图如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<TMS.MVC.BusinessSystemsSupport.Models.SearchDataTypeModel>" %>


<table class="classQueryResultsTable">
   <!-- the header -->
  <tr class="headerRow">

      <td>
      <%= Html.ActionLink("Effective Startdate",
                  "SortDetails",
                  "DataQryUpdate",
                  new
                  {
                      model = Model,
                      sortBy = "EffectiveStartDate",
                  },
                  new { @class = "classLinkLogDetails" })%>
      </td>

  </tr>


</table>

我的控制器操作:

代码语言:javascript
代码运行次数:0
运行
复制
    public ActionResult SortDetails(SearchDataTypeModel model, String sortBy)
    {

模型参数为空。将填充sortBy参数。我可以毫无问题地将字符串属性从模型传递给操作。不过,我想传入整个模型。

你知道我做错了什么吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-17 02:58:19

另一种选择是将所需数据持久化到TempData中。这将把它传递给下一个请求,您可以在那里检索它。如果你愿意,你应该能够持久化整个模型对象。

但更简单(也是更好的做法)是从数据库中再次检索它,如Darin所建议的那样。

票数 3
EN

Stack Overflow用户

发布于 2010-11-17 02:52:18

不能传递复杂的对象:

代码语言:javascript
代码运行次数:0
运行
复制
new
{
    model = Model,
    sortBy = "EffectiveStartDate",
},

model = Model没有任何意义,不能使用GET发送。您可能需要使用具有编辑器模板和/或隐藏字段的表单来发送所有模型属性。请记住,只能在查询字符串(key1=value1&key2=value2...)中发送标量值。脑海中浮现的另一个选择是只发送ID:

代码语言:javascript
代码运行次数:0
运行
复制
new
{
    modelId = Model.Id,
    sortBy = "EffectiveStartDate",
},

在您的控制器操作中,从您的数据存储中获取给定此id的模型:

代码语言:javascript
代码运行次数:0
运行
复制
public ActionResult SortDetails(int modelId, String sortBy)
{
    var model = repository.GetModel(modelId);
    ...
}

当然,只有当用户不应该编辑表单中的模型属性时,才会出现这种情况。这取决于您的方案。

为了完整起见,让我们公开另一个选项:使用MVC Futures的Html.Serialize助手将整个模型序列化到一个隐藏字段中,该字段可以传递回控制器操作并在那里反序列化。

票数 16
EN

Stack Overflow用户

发布于 2013-01-30 13:09:44

在ActionLink中,还有另一种将模型或复杂对象作为RouteValues传递的方法。

  1. 模型:让类中的静态方法序列化和反序列化,如下所示

public class XYZ { //某些字段公共字符串X{ get;set;}公共字符串Y{ get;set;}公共字符串X{ get;set;} //这会将传递的XYZ对象转换为JSON字符串公共静态字符串序列化(Xyz xyz) { var serializer = new JavaScriptSerializer();return serializer.Serialize(xyz);} //这会将传递的JSON字符串转换回XYZ object public static XYZ Action ( string data) { var serializer = new JavaScriptSerializer();return serializer.Deserialize(data);}}

  • 视图:在将复杂对象传递到操作视图之前,请先将其转换为JSON字符串

})%>

  • CONTROLLER:(Model.x,“<%=”,Html.ActionLink{ modelString =XYZ.Serialize(模型)操作方法中获取对象为字符串,并在使用前将其转换回object

public ActionResult SomeAction(string modelString) { XYX xyz = XYX.Deserialize(modelString);}

就这些了..。

注意:在其他答案中讨论的技术在模型的情况下已经足够好了,但有时您需要将一些复杂的对象(而不是数据库模型)传递回控制器,就像我有这样的特定情况一样。

希望这篇文章能帮助到一些...:)

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4197811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档