我的视图如下所示:
<%@ 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>
我的控制器操作:
public ActionResult SortDetails(SearchDataTypeModel model, String sortBy)
{
模型参数为空。将填充sortBy参数。我可以毫无问题地将字符串属性从模型传递给操作。不过,我想传入整个模型。
你知道我做错了什么吗?
发布于 2010-11-17 02:58:19
另一种选择是将所需数据持久化到TempData中。这将把它传递给下一个请求,您可以在那里检索它。如果你愿意,你应该能够持久化整个模型对象。
但更简单(也是更好的做法)是从数据库中再次检索它,如Darin所建议的那样。
发布于 2010-11-17 02:52:18
不能传递复杂的对象:
new
{
model = Model,
sortBy = "EffectiveStartDate",
},
model = Model
没有任何意义,不能使用GET发送。您可能需要使用具有编辑器模板和/或隐藏字段的表单来发送所有模型属性。请记住,只能在查询字符串(key1=value1&key2=value2...)中发送标量值。脑海中浮现的另一个选择是只发送ID:
new
{
modelId = Model.Id,
sortBy = "EffectiveStartDate",
},
在您的控制器操作中,从您的数据存储中获取给定此id的模型:
public ActionResult SortDetails(int modelId, String sortBy)
{
var model = repository.GetModel(modelId);
...
}
当然,只有当用户不应该编辑表单中的模型属性时,才会出现这种情况。这取决于您的方案。
为了完整起见,让我们公开另一个选项:使用MVC Futures的Html.Serialize助手将整个模型序列化到一个隐藏字段中,该字段可以传递回控制器操作并在那里反序列化。
发布于 2013-01-30 13:09:44
在ActionLink中,还有另一种将模型或复杂对象作为RouteValues传递的方法。
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);}}
})%>
public ActionResult SomeAction(string modelString) { XYX xyz = XYX.Deserialize(modelString);}
就这些了..。
注意:在其他答案中讨论的技术在模型的情况下已经足够好了,但有时您需要将一些复杂的对象(而不是数据库模型)传递回控制器,就像我有这样的特定情况一样。
希望这篇文章能帮助到一些...:)
https://stackoverflow.com/questions/4197811
复制相似问题