在Url.Action中发送字符串和模型

时间:2018-09-03 11:14:34

标签: c# asp.net-mvc

我的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中。

1 个答案:

答案 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
         }
     });
});