如何在 Url.Action 中调用视图



我有一个从Web api返回json数据的GET方法。我创建了一个相应的视图,但它显示的是 json 数据,而不是在视图页面上显示数据。我的代码如下:

[HttpGet]
public List<Project.Entity.ViewModels.PassCatalog.LBFrontendIPConfig> ListofLBFronendIPConfig(string resourceGroupName, string loadBalancerName)
{
try
{
var token = HttpContext.Session.GetString("Token");
var tenantid = HttpContext.Session.GetString("TenantId");
var sessionId = HttpContext.Session.GetString("SessionId");
if (!string.IsNullOrEmpty(token) || !string.IsNullOrEmpty(tenantid))
{
var path = $"/api/PaasCatalog/GetLBFrontendIPConfigList?resourceGroupName=" + resourceGroupName + "&loadBalancerName=" + loadBalancerName;
var response = _httpClient.SendRequestWithBearerTokenAsync(HttpMethod.Get, path, null, token, tenantid, _cancellationToken, sessionId).Result;
if (!response.IsSuccessStatusCode)
return null;
var result = response.Content.ReadAsStringAsync().Result;
if (result == null)
return null;
var jsontemplates = JsonConvert.DeserializeObject<List<Project.Entity.ViewModels.PassCatalog.LBFrontendIPConfig>>(result);
return jsontemplates;
}
else
{
RedirectToAction("SignOut", "Session");
}
}
catch (Exception ex)
{
_errorLogger.LogMessage(LogLevelInfo.Error, ex);
return null;
}
return null;
}

这就是我使用 Url.Action 调用视图的方式。

<i onclick="location.href='@Url.Action("ListofLBFronendIPConfig", "PaasCatalog",  new {LoadBalancerName = item.Name, resourceGroupName = item.RGName})'" class="fa fa-expand @Model.ActionClass.Edit" style="color:green;font-size: 18px;" data-toggle="tooltip" data-placement="bottom" title="Scale Up/Down" data-original-title="Tooltip on bottom"></i>

我错过了什么?请帮助我。谢谢。

MVC 操作在签名中的返回值应为 ActionResult(如果使用异步,则返回 Task(。 所以你的menthod应该被定义为...

[HttpGet]
public ActionResult ListofLBFronendIPConfig(string resourceGroupName, string loadBalancerName)
{
// . . . 
}

然后,您需要使用操作方法更改 return 语句,以使用在 MVC 控制器类上找到的"查看结果"帮助程序方法。 例如:

[HttpGet]
public ActionResult ListofLBFronendIPConfig( string resourceGroupName, string loadBalancerName )
{
try
{
var token = HttpContext.Session.GetString( "Token" );
var tenantid = HttpContext.Session.GetString( "TenantId" );
var sessionId = HttpContext.Session.GetString( "SessionId" );
if ( !string.IsNullOrEmpty( token ) || !string.IsNullOrEmpty( tenantid ) )
{
var path = $"/api/PaasCatalog/GetLBFrontendIPConfigList?resourceGroupName=" + resourceGroupName + "&loadBalancerName=" + loadBalancerName;
var response = _httpClient.SendRequestWithBearerTokenAsync( HttpMethod.Get, path, null, token, tenantid, _cancellationToken, sessionId ).Result;
if ( !response.IsSuccessStatusCode )
return new HttpStatusCodeResult(response.StatusCode);  //return a status code result that is not 200. I'm guessing on the property name for status code.
var result = response.Content.ReadAsStringAsync().Result;
if ( result == null )
return View();  // this one could be lots of things... you could return a 404 (return new HttpNotFoundResult("what wasn't found")) or you could return a staus code for a Bad Request (400), or you could throw and exception.  I chose to return the view with no model object bound to it.
var jsontemplates = JsonConvert.DeserializeObject<List<Project.Entity.ViewModels.PassCatalog.LBFrontendIPConfig>>( result );
return View(jsontemplates);
}
else
{
// retrun the redirect result...don't just call it
return RedirectToAction( "SignOut", "Session" );
}
}
catch ( Exception ex )
{
_errorLogger.LogMessage( LogLevelInfo.Error, ex );
// rethrow the exception (or throw something else, or return a status code of 500)
throw;
}
}

我更改了您所有的退货声明。 您需要一个名为ListofLBFronendIPConfig.cshtml的cshtml视图,该视图知道如何使用绑定到其模型的json对象。 希望这有帮助。

最新更新