我的cshtml中有以下URL.Action:
<a href="@Url.Action("ShowStudent", "Student", new { studentCode = item.StudentCode, newPrivateStudent = Model.PrivateStudent })">
<i class="icon-arrow-right"></i>
</a>
我的控制器中的操作是:
public ActionResult ShowCShowStudentlient(studentCode studentCode , PrivateStudentModel newPrivateStudent )
{ *some actions*}
在控制器中单击该动作时,会将newPrivateStudent设置为null。
知道为什么吗?
将newPrivateStudent属性设置为隐藏在cshtml中。
答案 0 :(得分:0)
首先,您应该看看这个@Url.Action
助手:
@Url.Action("ShowStudent", "Student", new { studentCode = item.StudentCode, newPrivateStudent = Model.PrivateStudent })
上面的帮助程序将生成带有查询字符串的URL,如以下示例所示(已测试):
<a href="/Student/ShowStudent?studentCode=XXX&newPrivateStudent=ProjectNamespace.Models.PrivateStudent">...</a>
如您在最后一个参数(newPrivateStudent
上看到的那样,助手没有添加复杂对象的内容,而是隐式调用ToString()
,该方法返回该对象的全限定名称(随后返回{{ 1}}在操作方法中具有空值)。因此,这样做的正确方法是使用AJAX回调将相应的键以及模型内容一起发布到控制器操作,并将其响应作为部分视图发送回目标DOM元素。
这里是一个使用AJAX回发在表单内发送模型内容的示例(假定使用HTML助手来生成输入元素):
newPrivateStudent
然后设置控制器操作以检索关键和序列化模型的内容,如下例所示:
$('#triggerElementId').click(function () {
// this example sets string parameter as hardcoded string
// change it to actual value by jQuery selector with val() or text() function
var sCode = "XXX";
var modelData = $('form').serialize();
// or serializeArray() if you want to push additional data
// if model contents should left unchanged, use 'var modelData = @Html.Raw(Json.Encode(Model.PrivateStudent))'
$.ajax({
type: 'POST',
url: '@Url.Action("ShowStudent", "Student")',
data: { studentCode: sCode, newPrivateStudent: modelData },
success: function (result) {
$('#targetResultElement').html(result);
},
error: function (xhr, status, error) {
// error handling
}
});
});