在同一个操作方法中返回JSON或部分视图

时间:2014-12-02 23:22:47

标签: ajax asp.net-mvc

根据MSDN,ActionResult用于返回多种类型的结果,具体取决于方法 You decide which type of action result to return based on the task that the action method is performing.

我刚刚开始了一项新工作,他们的MVC网站非常复杂和错综复杂,以至于在不破坏已经工作的情况下,某些变化真的很难实现。

我的问题是:使用Ajax.BeginForm,是否可以根据参数值从同一个操作方法返回JSON或部分视图?

这是一个简单的例子

@using (Ajax.BeginForm("AddNetworkLocationContact", "NetworkLocations", new AjaxOptions() {UpdateTargetId = "networkLocationList", OnSuccess = "onContactAddSuccess"}))  

它命中控制器(此时)可以访问名为PartialBeingCalledFrom的viewmodel属性。

取决于它的调用位置(Guide或EmergencyContactsTable)我希望它呈现JSON响应或部分视图响应。这条线不起作用。

 if(viewModel.PartialBeingCalledFrom == CallerLocation.Guide)
                return PartialView("_NetworkLocationList", GetNetworkLocationsViewModel(viewModel.ClientId, "New Emergency Contact has been added"));  

此行

return Json(new
                {
                    status = true,
                    updatedData = new
                    {
                        name = returnName,
                        number = returnListOfNumbers,
                        availability = viewModel.ExistingContactAvailablity,
                        contactId = viewModel.ExistingContactId,
                        docId = (string)network._id,
                        updatedContactsArray = (object)JsonConvert.SerializeObject(contactServices.GetContactPhoneNumberDictionary(ClientId.Value), Formatting.None)
                    }  

我假设的问题是我在OnSuccess中声明了一个Ajax.BeginForm方法,当我返回JSON数据时,该方法会正确运行。我假设jquery无法判断收到的内容是JSON还是视图,因此不知道何时执行上述ajax调用中提供的UpdateTargetId部分视图。有没有一种很好的方法来实现这种功能?

在我发布此内容之前没有出现在任何搜索中的Dupe!
ASP.NET MVC controller actions that return JSON or partial html

1 个答案:

答案 0 :(得分:-1)

您可以检查响应的内容类型以查看它是否为JSON。只要您的响应正确完成,就应该始终为JSON结果设置。

// make your onsuccess method take all 3 parameters that get passed back.
function myOnSuccess (result, status, xhr ){

    // get contentType.  set to empty string if null
    var contentType = xhr.getResponseHeader( 'content-type' ) || '';

    if (contentType.indexOf( 'json' ) > -1){
      // parse your json result and do json stuff.
    } else{
      // this is likely a partial view/html; do html stuff.
    }
}