मैं एमवीसी के लिए बिल्कुल नया हूं और बस कुछ हासिल करने की कोशिश कर रहा हूं जो मुझे लगता है कि हासिल करने के लिए बहुत जटिल नहीं होना चाहिए। बस यह जानना चाहते हैं कि इसके लिए सबसे अच्छा तरीका क्या है। मेरे पास एक ईवेंट-RSVP एप्लिकेशन (NerdDinner प्रकार) है जहां आप ईवेंट का विवरण देखने के लिए जाते हैं और फिर एक AJAX लिंक पर क्लिक करते हैं जो आपको ईवेंट के लिए RSVP करेगा।

    <% 
    if (Model.HasRSVP(Context.User.Identity.Name))
    {
    %>
    <p>
    You are registered for this event!&nbsp;            
    <%: 
    Ajax.ActionLink("Click here if you can't make it!", "CancelRegistration", "RSVP", new { id = Model.RSVPs.FirstOrDefault(r => r.AttendeeName.ToLower() == User.Identity.Name.ToLower()).RSVPID }, new AjaxOptions { UpdateTargetId = "QuickRegister"}) 
    %>
    </p>
    <% 
    }
    else
    { 
    %>
    <p>
    <%: 
Ajax.ActionLink("RSVP for this event", "Register", "RSVP", new { id=Model.EventID }, new AjaxOptions { UpdateTargetId="QuickRegister" }) %>
    </p>
    <% 
    } 
    %>

अब इन दो लिंक के अनुरूप, RSVP नियंत्रक में मेरे कार्य इस तरह दिखते हैं।

[Authorize, HttpPost]
public ActionResult Register(int id)
{
    Event event = eventRepository.GetEvent(id);

    if (event == null)
        return Content("Event not found");

    if (!event.IsUserRegistered(User.Identity.Name))
    {
        RSVP rsvp = new RSVP();
        rsvp.AttendeeName = User.Identity.Name;
        event.RSVPs.Add(rsvp);
        eventRepository.Save();            
    }

    return Content("Thanks, you are registered.");

}

[Authorize, HttpPost]
public ActionResult CancelRegistration(int id)
{
    RSVP rsvp = eventRepository.GetRSVP(id);    

    if (rsvp == null)
        return Content("RSVP not found");

    if (rsvp.Event.IsUserRegistered(User.Identity.Name))
    {
        eventRepository.DeleteRSVP(rsvp);
        eventRepository.Save();
    }

    return Content("Sorry, we won't be seeing you there!");
}

ये दोनों बिना किसी समस्या के काम करते दिखते हैं। अब मैं इन दोनों में से किसी एक को करके इसे थोड़ा सा प्रशंसनीय बनाना चाहता हूं:

1) नियंत्रक से एक AJAX लिंक लौटाएं ताकि जब आप पंजीकरण करें, तो आपको पृष्ठ को ताज़ा किए बिना आपको दिखाया गया रद्द पंजीकरण लिंक मिल जाए।

2) किसी भी तरह जब नियंत्रक विधि निष्पादन समाप्त हो जाती है तो दृश्य प्रतिपादन रीफ्रेश हो जाता है, इसलिए मेरे प्रश्न में पहला कोड ब्लॉक किसी भी AJAX लिंक के क्लिक के बाद निष्पादित हो जाता है। तो रजिस्टर पर क्लिक करने से आप रजिस्टर हो जाएंगे और आपको कैंसिल लिंक दिखाई देगा और कैंसिल पर क्लिक करने से आपका रजिस्ट्रेशन रद्द हो जाएगा और आपको रजिस्टर लिंक दिखाई देगा।

किसी भी तरह की सहायता का स्वागत किया जाएगा। धन्यवाद।

0
Hiral Desai 5 अप्रैल 2011, 03:20
नीचे टिप्पणियों में भ्रम के बाद, यहां कुछ और स्पष्टीकरण दिया गया है। मैं जो करने में सक्षम होना चाहता हूं वह है 1) आपने सदस्यता नहीं ली है (पाठ) और आरएसवीपी (लिंक) पर क्लिक करें 2) आपने सदस्यता ली है (पाठ) और उपयोगकर्ता की वर्तमान आरएसवीपी स्थिति के आधार पर वैकल्पिक रूप से प्रदर्शित रद्द करने के लिए क्लिक करें (लिंक) . ऐसा करने के लिए क्लाइंट से कोई विशिष्ट आवश्यकता नहीं है, यह मेरे सीखने एएसपी नेट एमवीसी का एक हिस्सा है और मैं सिर्फ यह समझना चाहता हूं कि मेरे पास कौन से विकल्प हैं। नीचे आपकी टिप्पणियों से, ऐसा लगता है कि jQuery $.post() जाने का रास्ता है। इसलिए अब मैं आगे की जांच करूंगा और देखूंगा कि क्या मुझे कोई समस्या है।
 – 
Hiral Desai
6 अप्रैल 2011, 14:01

2 जवाब

सबसे बढ़िया उत्तर

आप jQuery शो का उपयोग करके इन लिंक को छुपा सकते हैं।

मैं कभी भी अजाक्स का उपयोग नहीं करता हूं। एक्शनलिंक, मैं अपने AJAX को सहायक के बिना करता हूं लेकिन मुझे लगता है कि इसे इस तरह दिखना चाहिए:

Ajax.ActionLink("Click here if you can't make it!", "CancelRegistration", "RSVP", new { id = Model.RSVPs.FirstOrDefault(r => r.AttendeeName.ToLower() == User.Identity.Name.ToLower()).RSVPID }, new AjaxOptions { UpdateTargetId = "QuickRegister", OnSuccess = "ShowHideLinks" }, new { id = "cancel-link", @style = "display:none"})
Ajax.ActionLink("RSVP for this event", "Register", "RSVP", new { id=Model.EventID }, new AjaxOptions { UpdateTargetId="QuickRegister", OnSuccess = "ShowHideLinks" }, new { id = "register-link"})

और कुछ जावास्क्रिप्ट/jQuery वर्तमान प्रदर्शन लिंक को प्रारंभ करने के लिए:

        function ShowHideLinks() {
            $('#register-link').toggle();
            $('#cancel-link').toggle();
        }
        <%: if(Model.HasRSVP(Context.User.Identity.Name)) { %>
            ShowHideLinks();
        <%: } %>

उममीद है कि इससे मदद मिलेगी!

1
VinnyG 5 अप्रैल 2011, 04:48
मुझे नहीं लगता कि यह दृष्टिकोण काम करेगा क्योंकि सामग्री गतिशील है। मूल रूप से मैं चाहता हूं कि यह काम करे ताकि जिस दृश्य से मैं लिंक पर क्लिक कर रहा हूं वह क्लिक के बाद अपडेट हो जाए।
 – 
Hiral Desai
6 अप्रैल 2011, 02:53
आप अपने अद्यतन भाग में क्या दिखाना चाहते हैं? आपको हमें और जानकारी प्रदान करने की आवश्यकता है। मुझे यह भी लगता है कि आपको jQuery $.post() का उपयोग करना चाहिए न कि Ajax.ActionLink का। यदि आपका डेटा जटिल है, तो आप jQuery टेम्पलेट पर भी एक नज़र डालना चाहेंगे, आप अपने नियंत्रक में HTML वापस नहीं करना चाहते हैं: api.jquery.com/jQuery.template
 – 
VinnyG
6 अप्रैल 2011, 06:33
धन्यवाद, मैंने अपने प्रश्न में एक टिप्पणी जोड़ दी है, उम्मीद है कि इससे चीजें स्पष्ट हो जाएंगी।
 – 
Hiral Desai
6 अप्रैल 2011, 14:05

आप jQuery का उपयोग करके लिंक सेट कर सकते हैं। मैं देखता हूं कि आप दोनों क्रिया विधियों से सामग्री पास कर रहे हैं ... आप इन क्रियाओं को निष्पादित करने के लिए jQuery में $.post() का उपयोग कर सकते हैं और सफलता ईवेंट हैंडलर में लौटाई गई सामग्री की तुलना करें (आपको कुछ ऐसा भेजने की आवश्यकता होगी जो तुलना करना अधिक आसान हो वर्तमान तारों की तुलना में) और लिंक को उचित रूप से सेट करें।

0
sajoshi 5 अप्रैल 2011, 06:05
आपके उत्तर के लिए धन्यवाद। यह काम करेगा लेकिन पेज के काम करने के तरीके में कुछ बदलावों की आवश्यकता होगी। क्या होगा यदि मैं चाहता हूं कि उपयोगकर्ता पंजीकृत है या नहीं, इस आधार पर पृष्ठ पर प्रदर्शित डेटा गतिशील हो। कृपया मुझे सुधारें अगर मुझे आपकी प्रतिक्रिया ठीक से समझ में नहीं आई है।
 – 
Hiral Desai
6 अप्रैल 2011, 02:55
जैसा कि आपने कहा - आप रेफ़रेश किए गए पेज पर नहीं हैं, आपको कोड में कुछ बदलाव करने होंगे। हालाँकि - जब आप कहते हैं कि पृष्ठ पर प्रदर्शित डेटा गतिशील है - आप संदर्भ (इनलाइन html) पास करके और इसे पृष्ठ पर प्रस्तुत करके अपने वर्तमान कार्यों से प्राप्त कर सकते हैं।
 – 
sajoshi
6 अप्रैल 2011, 05:58
स्पष्ट करने के लिए आपको धन्यवाद। मैं नियंत्रक से इनलाइन एचटीएमएल नहीं भेजना चाहता हूं। मैं नीचे दिए गए @VinnyG द्वारा बताए गए jQuery $.post() का उपयोग करूंगा।
 – 
Hiral Desai
6 अप्रैल 2011, 14:04