2010-10-05 9 views
8

मेरे पास निम्न परिदृश्य है: मेरी वेबसाइट लेख प्रदर्शित करती है (एक व्यवस्थापक द्वारा इनपुट। ब्लॉग की तरह)।एएसपी.नेट एमवीसी नियंत्रक पैरामीटर वैकल्पिक (यानी इंडेक्स (int? Id))

इसलिए एक लेख देखने के लिए, उपयोगकर्ता को होम/आलेख/{आलेख आईडी} का संदर्भ दिया जाता है।

हालांकि, उपयोगकर्ता jsTree सूची का उपयोग करके articles.aspx स्वयं के भीतर से कौन सा लेख देखने के लिए चुनता है।

तो मुझे जो करना है वह दो मामलों के बीच अंतर करने में सक्षम होना है: उपयोगकर्ता एक विशिष्ट लेख तक पहुंच रहा है, या वह बस "मुख्य" लेख पृष्ठ तक पहुंचने का प्रयास कर रहा है। मैंने "आलेख" नियंत्रक पैरामीटर को वैकल्पिक (int? Id) के रूप में सेट करने का प्रयास किया, लेकिन फिर मुझे नियंत्रक के अंदर आईडी मान का उपयोग करने में समस्याएं आ रही हैं।

इस परिदृश्य को संभालने का सबसे अच्छा तरीका क्या है? शायद मुझे यह जांचने के लिए एक बेहतर तर्क की आवश्यकता है कि "यूआरएल" में आईडी पैरामीटर की आपूर्ति की गई हो या नहीं?

मैं दो दृश्य/नियंत्रकों का उपयोग करने से बचने की कोशिश कर रहा हूं, बस कोड-डुप्लिकेशन कारणों से बाहर।

उत्तर

13

उपयोग अलग क्रियाएं, जैसे:

public ActionResult Articles() ... 
public ActionResult Article(int id) ... 

वैकल्पिक रूप से एक लेख नियंत्रक पर ले जाते हैं (डिफ़ॉल्ट मार्ग का उपयोग कर यूआरएल होगा: Articles और Articles/Detail/{id}):

public class ArticlesController : Controller 
{ 
    public ActionResult Index() ... 
    public ActionResult Detail(int id) ... 
} 

आप अभी भी उपयोग करना आवश्यक है जैसा कि आपने पोस्ट किया है, इनमें से किसी एक को आजमाएं:

public ActionResult Articles(int id = 0) 
{ 
    if(id == 0) { 
     return View(GetArticlesSummaries()); 
    } 
    return View("Article", GetArticle(id)); 
} 
public ActionResult Articles(int? id) 
{ 
    if(id == null) { 
     return View(GetArticlesSummaries()); 
    } 
    return View("Article", GetArticle(id.Value)); 
} 
+0

"वैकल्पिक रूप से इसे एक लेख नियंत्रक में ले जाएं (डिफ़ॉल्ट मार्ग का उपयोग कर यूआरएल होगा: लेख और लेख/विवरण/{आईडी}):" यह शायद इसके बारे में जाने का सबसे अच्छा तरीका है। धन्यवाद! –

0

आवश्यक पैरामीटर बनाएं, फिर रूटिंग में एक डिफ़ॉल्ट मान सेट करें जो एक मान है जो मान्य इंडेक्स नहीं है और यह आपकी क्रिया को इंगित करता है कि इसे मुख्य पृष्ठ प्रस्तुत करना चाहिए।

1

यह मेरे लिए दो अलग-अलग पृष्ठों की तरह लगता है और इसे इस तरह माना जाना चाहिए। आपके पास "मुख्य" दृश्य पृष्ठ और "लेख" पृष्ठ है।

मैं इसे दो कार्यों में विभाजित कर दूंगा। उन्हें वास्तव में बहुत अधिक डुप्लिकेशन नहीं होना चाहिए, दोनों को एक ही मॉडलव्यू प्राप्त करने के लिए कॉल करना चाहिए और लेख को बस उसमें विस्तार मिलेगा!

5

ईद कि आप जानते हैं कि इसके लिए एक सामान्य मूल्य को परिभाषित करें संकेत दिया कोई मूल्य नहीं आपूर्ति की गई थी - आम तौर पर सभी की 0.

public ActionResult Articles([DefaultValue(0)]int Id) 
{ 
    if (Id == 0) 
    // show all 
    else 
    // show selected 
.. 
+0

धन्यवाद, यह वही है जो मुझे चाहिए था। –

+1

DefaultValue विशेषता का उपयोग इस समस्या को हल करने के लिए एक बहुत भ्रमित तरीके की तरह लगता है। – Ryan

+0

हम्मम्म ... शायद मैं 2 विचारों का उपयोग करूँगा। मुझे मुख्य प्रारंभिक लेख पृष्ठ की आवश्यकता अधिक "दिलचस्प" HTML बुद्धिमानी है। –

7

पहले, मैं @Steve से सहमत :)। लेकिन क्या तुम सच में उपयोग करना चाहते हैं

int? id 

तुम सिर्फ अगर आईडी एक सरल

if(id == null) 

और यदि हां, तो आपके DB से सभी लेख लोड (या कुछ का उपयोग कर सेट किया गया है अपने नियंत्रक विधि में जाँच कर सकते हैं एक जैसे) और इन्हें अपने दृश्य में पास करें (या तो सीधे, या एक दृश्य मॉडल का उपयोग करके)। यदि आईडी सेट है तो आप उस आईडी को अपने डीबी से प्राप्त करने वाले आलेख को लोड करें और इसे देखने के लिए भेजें (संभावित रूप से एक सूची में भी यदि आप दृश्य मॉडल का उपयोग नहीं करते हैं)?

आपके विचार में देखने के लिए दिए गए लेखों के साथ सूची में सभी लेख लोड करें। जिसमें सभी या सिर्फ एक शामिल है।

पूरा डमी कोड

public ActionResult showArticles(int? id){ 
    List<Articles> aList; 
    if(id == null){ 
     aList = repository.GetAllArticles().ToList(); 
    }else{ 
     aList = new List<Articles>(); 
     aList.add(repository.GetArticleByID(id)); 
    } 

    return View(aList); 
} 

की तरह कुछ है आपका दृश्य:

<% Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<List<Articles>>"%> 

foreach(Articles a in Model) 
    //display article 

और आप इसे अगले दो विकल्पों में से किसी का उपयोग कर फोन:

html.ActionLink("one article","showArticles","Articles",new {id = aID},null} 

html.ActionLink("all articles","showArticles","Articles"} 
2

सबसे आसान समाधान है दो अलग-अलग कार्रवाइयों और विचारों के लिए, लेकिन कार्यों को समान नाम दें।

एक ही नियंत्रक का उपयोग करना, DefaultValue साथ:

public ActionResult Articles([DefaultValue(0)]int id) 

हैं DefaultValue इस्तेमाल किया गया था, मैं "MainArticles" दृश्य का उल्लेख

public ViewResult Articles() 
{ 
    //get main page view model 
    return View("MainPage", model); 
} 

public ViewResult Articles(int id) 
{ 
    // get article view model 
    return View(model); 
} 
+1

ठीक है, लेकिन जब मैं का उपयोग कर मुख्य लेख पेज कॉल करने के लिए प्रयास करें: वर्तमान अनुरोध: <% = Html.ActionLink ("लेख", "लेख", "घर")%> मैं कोई त्रुटि मिलती है नियंत्रक प्रकार 'होम कंट्रोलर' पर कार्रवाई 'लेख' के लिए निम्नलिखित क्रिया विधियों के बीच संदिग्ध है: System.Web.Mvc.ActionResult लेख() प्रकार dr_teman_MVC.Controllers.HomeController System.Web.Mvc.ActionResult लेख (Int32) पर टाइप करें dr_teman_MVC.Controllers.HomeController –

+0

क्या आपका (डिफ़ॉल्ट) मार्ग डिफ़ॉल्ट आईडी निर्दिष्ट करता है? मुझे लगता है कि यह एक मुद्दा हो सकता है। मैं शायद एक एक्शन लेख और अन्य आलेख का नाम दूंगा। – Ryan

0

खैर, यह संयुक्त समाधान मैं उपयोग कर रहा हूँ है। यदि कोई आलेख आईडी प्रदान की गई थी - मैं ViewModel के अंदर पारित उचित आलेख के साथ "आलेख" दृश्य का संदर्भ देता हूं।

दोनों मामलों में व्यूमोडेल डेटा के साथ पॉप्युलेट किया गया है, दोनों विचारों की आवश्यकता है (पूरा लेख और श्रेणी सूचियां)।

आपकी मदद के लिए सभी को धन्यवाद!

0

मैं अगर आप इस की कोशिश की पता नहीं है, लेकिन इसके बजाय यदि आप मान सीधे यूआरएल में, के बजाय इस तरह इसे पारित की टाइप कर रहे तो:

controller/action?id=value

:

controller/action/idValue

इस तरह इसे पारित करने की कोशिश

संबंधित मुद्दे