2013-05-23 9 views
8

दोनों पर काम करने के लिए एक्शनकंट्रोलर कैसे बनाएं, मेरे पास एक एड्रेसबुक नियंत्रक है जो "फ़ोल्डर" (मूल रूप से समूह/स्थान) की एक सूची लौटाएगा। इसे AJAX अनुरोध के माध्यम से या एमवीसी पृष्ठ के भीतर ही प्रस्तुत करने के समय कहा जा सकता है।रन टाइम पर और AJAX

मैं एक ऐसा फ़ंक्शन कैसे बना सकता हूं जो दोनों परिदृश्यों के लिए अच्छा काम करेगा?

public ActionResult GetFolderList(int? parent) 
{ 
    List<String> folderList = new List<String>(); 
    folderList.Add("East Midlands"); 
    folderList.Add("West Midlands"); 
    folderList.Add("South West"); 
    folderList.Add("North East"); 
    folderList.Add("North West"); 

    if(Request.IsAjaxRequest()) 
    { 
     return Json(folderList); 
    } 

    return View("someView", folderList); 

} 

उत्तर

9

बस: यहाँ मेरे वर्तमान नियंत्रक कार्रवाई जो मैं अपने MVC पेज

public ActionResult GetFolderList(int? parent) 
{ 
    List<String> folderList = new List<String>(); 
    folderList.Add("East Midlands"); 
    folderList.Add("West Midlands"); 
    folderList.Add("South West"); 
    folderList.Add("North East"); 
    folderList.Add("North West"); 

    return Json(folderList); 
} 

भीतर (काम नहीं कर एटीएम)

@{ 
    var controller = new My.Controllers.AddressBookController(); 
    var what = controller.GetFolderList(0); 

    foreach(var p in what){ 
     //i want to get the list items here 
    } 
} 
+0

क्लाइंट से POST कॉल कर रहे हैं, इसलिए '[HttpPost]' विशेषता के साथ अपनी क्रिया विधि को सजाने के लिए मत भूलना। – Shyju

+0

@Shyju इसे किसी भी माध्यम से सजा नहीं रहा है कि यह सभी क्रियाओं को स्वीकार करेगा :) – mattytommo

+1

आप विधि प्राप्त करने के लिए क्यों पोस्ट करेंगे जो स्पष्ट रूप से प्राप्त होनी चाहिए? (यह भी इसके नाम में मिलता है!) – Joshua

5

का उपयोग कर पृष्ठ के भीतर के साथ संघर्ष करने लगते हैं यह काम करेगा एक ऐसा फ़ंक्शन है जो List देता है, फिर इसे अपने पृष्ठ लोड और AJAX अनुरोध कार्य विधियों दोनों में कॉल करें।

कुछ की तरह: फिर

@model YourViewModel 

@{ 
    foreach(var item in Model.FolderList){ 
     //do whatever you want 
    } 
} 

:

public List<string> GetFolderList() 
{ 
    List<String> folderList = new List<String>(); 
    folderList.Add("East Midlands"); 
    folderList.Add("West Midlands"); 
    folderList.Add("South West"); 
    folderList.Add("North East"); 
    folderList.Add("North West"); 

    return folderList; 
} 
तो पृष्ठ लोड पर

, आप छड़ी कर सकते हैं कि अपने मॉडल में:

public ActionResult Index() 
{ 
    var model = new YourViewModel(); //whatever type the model is 

    model.FolderList = GetFolderList(); //have a List<string> called FolderList on your model 

    return View(model); //send model to your view 
} 

फिर अपने दृश्य में आप कर सकते हैं , मानते हुए कि आपका AJAX अनुरोध कुछ ऐसा था:

$.ajax({ 
    url: '@Url.Action("GetFolders", "ControllerName")', 
    type: 'POST', 
    datatype: 'json', 
    success: function (result) { 
     for (var i = 0; i < result.length; i++) 
     { 
      //do whatever with result[i] 
     } 
    } 
}); 

आपका GetFolders कार्रवाई विधि दिखाई देगा:

public ActionResult GetFolders() 
{ 
    return Json(GetFolderList()); 
} 
2

सबसे पहले, आप अपने ध्यान में रखते हुए कुछ इस तरह कभी नहीं करना चाहिए:

var controller = new My.Controllers.AddressBookController(); 
var what = controller.GetFolderList(0); 

इससे आपका दृश्य और के बीच तंग युग्मन बनाता है नियंत्रक, जो काफी एमवीसी के सिद्धांतों का उल्लंघन करता है। अब, अपने सवालों के जवाब देने के लिए।

मैटिटोमो के रूप में उल्लिखित, आप दृढ़ता से टाइप किए गए दृश्य का उपयोग करना चाहेंगे और दृश्य सूची से अपनी सूची प्राप्त कर सकते हैं। नीचे दिए गए कुछ साधारण मामले के लिए काम करेंगे। अब

@model List<string> 

@{ 
    foreach (var p in Model) 
    { 
     p; 
    } 
} 

, आप या AJAX के लिए एक नियंत्रक विधि Request.IsAjaxRequest का उपयोग कर के रूप में मैरिस ने बताया के साथ एक सामान्य अनुरोध का उपयोग कर सकते हैं: इस दृश्य को और अधिक जटिल हो जाता है, तो आप एक वास्तविक दृश्य मॉडल वस्तु की आवश्यकता होगी। आपके विचार मान लिया जाये कि "FolderList" नाम दिया गया है, नियंत्रक कार्रवाई इस प्रकार दिखाई देगा:

public ActionResult GetFolderList(int? parent) 
    { 
     List<String> folderList = new List<String>(); 
     folderList.Add("East Midlands"); 
     folderList.Add("West Midlands"); 
     folderList.Add("South West"); 
     folderList.Add("North East"); 
     folderList.Add("North West"); 

     if (Request.IsAjaxRequest()) 
     { 
      return Json(folderList); 
     } 

     return View("FolderList", folderList); 
    } 

अब जब आप इस विधि AJAX के माध्यम से इसे folderList की JSON प्रतिनिधित्व वापस आ जाएगी, अन्यथा यह आपके FolderList दृश्य वापस आ जाएगी फोन ।

0

मैं एक बार एक ActionFilter कि सिर्फ इतना है कि करता है लिखा है, यह JsonResult साथ ActionResult ओवरराइड करता है एक बार Accept HTTP हेडर json शामिल (और केवल अजाक्स अनुरोध करने के लिए ही सीमित हो सकती है, true साथ onAjaxOnly पास करके):

public class ReturnJsonIfAcceptedAttribute : ActionFilterAttribute 
{ 
    private bool _onAjaxOnly; 
    private bool _allowJsonOnGet; 

    public ReturnJsonIfAcceptedAttribute(bool onAjaxOnly = true, bool allowJsonOnGet = false) 
    { 
     _onAjaxOnly = onAjaxOnly; 
     _allowJsonOnGet = allowJsonOnGet; 
    } 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 

     if (!_allowJsonOnGet && request.HttpMethod.ToUpper() == "GET") 
      return; 

     var isAjax = !_onAjaxOnly || request.IsAjaxRequest(); 

     if (isAjax && request.AcceptTypes.Contains("json", StringComparer.OrdinalIgnoreCase)) 
     { 
      var viewResult = filterContext.Result as ViewResult; 

      if (viewResult == null) 
       return; 

      var jsonResult = new JsonResult(); 
      jsonResult.Data = viewResult.Model; 

      filterContext.Result = jsonResult; 
     } 
    } 

तो फिर आप अपने Action जिस तरह से यह है रखने के लिए, तुम सिर्फ नए ReturnJsonIfAcceptedAttribute संलग्न:

[ReturnJsonIfAccepted] 
public ActionResult Index() 
{ 
    var model = new Model(); // whatever 
    return View(model); 
} 
संबंधित मुद्दे