मैं कॉलिंग ऐप को निर्णय लेने की अनुमति देना चाहता हूं। मैंने एक मल्टीव्यू कंट्रोलर को एक साथ चिपकाया है (मुझे जो कोड मिला है, मैं क्रेडिट के साथ अपडेट करने का प्रयास करूंगा, जब मैं इसे पाता हूं) कि, एक्शन एक्सटेंशन के आधार पर, उपयुक्त प्रारूप वापस कर देगा।उदाहरण के लिए:
myapp.com/api/Users/1 - defaults to html based on route
myapp.com/api/Users.html/1 - html
myapp.com/api/Users.json/1 - json
myapp.com/api/Users.xml/1 - xml
myapp.com/api/Users.partial/1 - returns a partial view of action name (see code)
myapp.com/api/Users.clean/1 - partial html without styling, etc...
मेरे नियंत्रकों MultiViewController से और के बजाय वारिस "वापसी दृश्य (मॉडल)," मैं बस "रिटर्न फॉर्मेट व्यू (मॉडल) या प्रारूप दृश्य (" व्यूनाम ", मॉडल) कहता हूं;"। दूसरा अगर मुझे परिणाम के लिए एक विशिष्ट दृश्य लागू करने की आवश्यकता है - निहित दृश्य नहीं।
मल्टीव्यू कंट्रोलर इस तरह दिखता है। FormatView पर विशेष ध्यान दें, whitch एक कार्रवाई परिणाम देता है:
public abstract class MultiViewController : Controller
{
private const string FORMAT_KEY = "format";
public enum FileFormat {Html, Json, Xml, Partial, Clean}
protected MultiViewController()
{
RequestedFormat = FileFormat.Html;
}
protected FileFormat RequestedFormat { get; private set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var routeValues = filterContext.RouteData.Values;
if (routeValues.ContainsKey(FORMAT_KEY))
{
var requestedFormat = routeValues[FORMAT_KEY].ToString();
if (isValidFormat(requestedFormat))
{
RequestedFormat = (FileFormat)Enum.Parse(typeof(FileFormat), requestedFormat, true);
}
}
}
private bool isValidFormat(string requestedFormat)
{
return Enum.GetNames(typeof (FileFormat)).Any(format => format.ToLower() == requestedFormat.ToLower());
}
protected ActionResult FormatView(string viewName, object viewModel)
{
switch (RequestedFormat)
{
case FileFormat.Html:
if (viewName != string.Empty)
{
return View(viewName,viewModel);
}
return View(viewModel);
case FileFormat.Json:
return Json(viewModel);
case FileFormat.Xml:
return new XmlResult(viewModel);
case FileFormat.Partial:
//return View(this.ControllerContext.RouteData.Values["action"] + "Partial");
return PartialView(this.ControllerContext.RouteData.Values["action"] + "Partial");
case FileFormat.Clean:
if (viewName != string.Empty)
{
return View(viewName, "~/Views/Shared/Clean.master", viewModel);
}
var v = View(viewModel);
v.MasterName = "~/Views/Shared/Clean.Master";
return v;
default:
throw new FormatException(string.Concat("Cannot server the content in the request format: ", RequestedFormat));
}
}
protected ActionResult FormatView(object viewModel)
{
return FormatView("", viewModel);
}
}
Clean.master बस एक मास्टर पृष्ठ है कि किसी भी अतिरिक्त एचटीएमएल शामिल नहीं करता है - यह दृष्टिकोण लेता है (ताकि मैं किसी भी आंशिक वर्गों को मजबूत कर सकते हैं) और इसे स्वच्छ एचटीएमएल के साथ प्रस्तुत करता है जिसे सीधे रखा जा सकता है।
यदि मैं जेसन चाहता हूं - नियंत्रक मेरा व्यूमोडेल बनाता है और उसके बाद उस दृश्य मॉडल को जेसन के रूप में देता है, डिफ़ॉल्ट दृश्य को भेजने के बजाय - .xml के साथ।
आंशिक विचार उसमें थोड़ा दिलचस्प हैं, सम्मेलन के अनुसार, मेरे सभी मुख्य विचार आंशिक रूप से विभाजित हो जाते हैं, ताकि विशेष आंशिक रूप से अनुरोध किया जा सके - यह jquery का उपयोग करके एक अपडेट पैनेल की कार्यक्षमता की नकल करने के लिए आसान है अपडेट पैनेल से जुड़े सभी जंक के बिना।
टिप्पणियों पर टिप्पणियों पर जा रहे चर्चा पर: - बिलकुल, आपके लिए कई तरीके उपलब्ध हैं। जो कुछ भी आपको पसंद है उसका प्रयोग करें। एमवीसी चट्टानों !!!! – IsmailS