asp MVC:是否可以确定如何调用控制器方法?

时间:2009-07-05 17:16:07

标签: jquery asp.net-mvc

控制器方法是否可以在静态调用时返回视图,如果通过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);
        }
    

2 个答案:

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

 }