控制器方法是否可以在静态调用时返回视图,如果通过JavaScript调用,则返回JsonResult。 我的动机是我希望能够自由地实现我的视图,但是我想要这样做而不必创建两个控制器方法(每个单独的场景一个...请参阅下面的详细说明)。
如果我要说我在浏览器中输入www.example.com/person/get?id=232
,我希望Get(int id)
方法执行以下操作:
public ActionResult Get(int id)
{
Person somePerson = _repository.GetPerson(id);
ViewData.Add("Person", somePerson);
return View("Get");
}
但是如果让我们说通过jQuery调用相同的控制器方法:
//controller method called asynchronously via jQuery
function GetPerson(id){
$.getJSON(
"www.example.com/person/get", //url
{ id: 232 }, //parameters
function(data)
{
alert(data.FirstName);
} //function to call OnComplete
);
}
我希望它的行为如下:
public JsonResult Get(int id)
{
Person somePerson = _repository.GetPerson(id);
return Json(somePerson);
}
答案 0 :(得分:4)
我明白了。在上面的特定场景中,我可以这样做:
if(Request.IsAjaxRequest())
{
return Json(someObject);
}
else
{
ViewData.Add("SomeObject", someObject);
return View("Get");
}
我现在可以开始针对这个问题采取更“优雅”的解决方案....> _<
答案 1 :(得分:4)
您可以使用ActionMethodSelector属性执行此操作 首先像这样创建你的属性:
public class IsAjaxRequest :ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
return controllerContext.HttpContext.Request.IsAjaxRequest();
}
}
然后使用它:
public ActionResult Get( int id )
{
Person somePerson = _repository.GetPerson(id);
ViewData.Add("Person", somePerson);
return View("Get");
}
[IsAjaxRequest]
[ActionName("Get")]
public ActionResult Get_Ajax( int id )
{
Person somePerson = _repository.GetPerson(id);
return Json(somePerson);
}