2009-05-05 14 views
8

प्रसंग
चलो का कहना है कि मेरे पास है:
लेआउट Site.Master में:एकाधिक रूपों

<div class="leftColumn"> 
    <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
</div> 
<div class="rightColumn"> 
    <% Html.RenderPartial("_Login"); %> 
    <asp:ContentPlaceHolder ID="SideContent" runat="server" /> 
</div> 

लॉग इन partialView लगता है:

<form action="/myApp/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 
    <button>Login</button> 
</form> 

है केवल लॉगिन विजेट फॉर्म को अपडेट करना संभव है, न कि संपूर्ण सामग्री पृष्ठ?

उत्तर

15

यदि आप http पोस्ट का जिक्र कर रहे हैं, तो फ़ॉर्म के भीतर से सबमिट बटन द्वारा केवल एक पोस्ट शुरू की गई है (इसे जावास्क्रिप्ट द्वारा भी शुरू किया जा सकता है) सर्वर पर पोस्ट किया जाएगा।

यदि आपके फॉर्म घोंसले हैं तो यह काम नहीं करेगा। बाहरी रूप हमेशा सर्वर पर पोस्ट करेगा।

नीचे दिए गए नमूने एचटीएमएल में, पहले फॉर्म पर सबमिट बटन पर क्लिक करने से दूसरे फॉर्म से सर्वर को मूल्य नहीं भेजा जाएगा। इसी तरह, दूसरे सबमिट बटन पर क्लिक करने से पहले फॉर्म से मूल्य पोस्ट नहीं होंगे।

<html> 
... 
    <body> 
    <div> 

     <form action="/Login/Login" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login" /> 
     </form> 


     <form action="/Login/AdminLogin" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login Admin" /> 
     </form> 
    </div> 
</body> 
</html> 

आप केवल अद्यतन करने के लिए/प्रपत्र अनुभाग में से एक को बदलने चाहते हैं, तो कोई इस जावास्क्रिप्ट का उपयोग करने के लिए और एक जावास्क्रिप्ट पोस्ट (उर्फ Ajax) के बिना प्रदर्शन नहीं किया जा सकता।

+1

यय ... उस प्रश्न के बावजूद निश्चित रूप से अस्पष्ट था, यह वही है जो मैं सुनना चाहता था: "यदि आप केवल फॉर्म अनुभाग में से किसी एक को अपडेट/बदलना चाहते हैं, तो इसका उपयोग किए बिना नहीं किया जा सकता"। अब तक ऐसा लगता है कि एएसपीनेट एमवीसी में तथाकथित विजेट को लागू करने के लिए एक साफ तरीका नहीं है। :/ –

+0

यह एमवीसी की सीमा नहीं है - आप केवल पृष्ठ के हिस्से को अपडेट करने के लिए कह रहे हैं, इसलिए आपको कुछ क्लाइंट साइड (उदा। AJAX/JS) करना होगा क्योंकि सभी परिभाषाओं के अनुसार सभी HTML रूप सबमिट किए जाने पर पृष्ठ बदल देंगे। –

+0

प्रश्न सिर्फ 'लोकप्रिय' बैज चिह्न मारा। आश्चर्यजनक रूप से यह देखने के लिए कि मैंने कितना सीखा है। इतना बेवकूफ सवाल। : डी –

0
if(pass != true) 
{ 
ViewData["Message'] = "Hey your login failed!"; Return View("Login") 
} 

ViewPage

<form action="/tralala/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 

    <button>Login</button> 
<div style="color: red"><%=ViewData["Message"] %><div> 
</form> 
+1

आप बिंदु चूक गए। प्रश्न था - केवल 1 फॉर्म को अपडेट करने के लिए, यदि यह संभव है, तो ViewData शब्दकोश का उपयोग कैसे करें। –

+0

क्षमा करें दोस्त, मैं आपका प्रश्न पढ़ता रहता हूं और मुझे समझ में नहीं आता कि आप क्या पूछ रहे हैं। – Skiltz

+1

मैं सिर्फ पूछ रहा हूं, यदि 2

तत्व वाले पृष्ठ उस समय केवल उनमें से 1 अपडेट कर सकते हैं, दूसरे को स्पर्श नहीं कर सकते हैं। –

0

पर आपका प्रश्न बहुत स्पष्ट नहीं है।

लेकिन जहां तक ​​मैं समझ सकता था, उत्तर सबसे अधिक संभावना है हां। आप उपयोगकर्ता इनपुट के आधार पर जो कुछ भी चाहते हैं उसे अपडेट कर सकते हैं।

+0

मैं यह भी नहीं समझता कि आप क्या पूछ रहे हैं ... क्या आप कुछ और संदर्भ देने के लिए अपने प्रश्न को संपादित कर सकते हैं। आपका पहला 'फॉर्म' बुरी तरह से गठित है और इसमें कोई इनपुट तत्व नहीं है ... इसके लिए क्या है? मैंने सोचा कि मॉडलव्यूस्टेट केवल उन फ़ील्ड को अपडेट करता है जिन्हें उन्होंने बांधने की कोशिश की ...? क्या वह लॉगिन विजेट या लॉगिन पेज है? या क्या आपको सत्यापन संदेश और सत्यापन हाइलाइटिंग के साथ समस्याएं हैं? मुझे कई रूपों को संभालने के लिए कुछ कस्टम HTMLHelper एक्सटेंशन बनाना था, लेकिन मुझे वास्तव में पता नहीं है कि वे यहां आवेदन करते हैं क्योंकि मैं समझ नहीं पा रहा हूं कि आपकी समस्या क्या है ... कुछ और जानकारी मददगार होगी। – Charlino

+0

मैं वास्तव में क्षमा चाहता हूँ। अंग्रेजी भी मेरा मूल नहीं है। मैं सवाल संपादित करने की कोशिश करूंगा। –

1

यदि आप एक फॉर्मूलेक्शन स्वीकार करते हैं जो आपके पास एक नियंत्रक विधि बनाता है और आपके दृश्य में दो रूपों को परिभाषित किया गया है, तो फॉर्मक्लुलेशन वापस या तो फॉर्म ए या फॉर्म बी के मानों के साथ पॉप्युलेट किया जाएगा। आप फॉर्म का चयन कर सकते हैं और अपने तर्क को शाखा के आधार पर उसमें मूल्य यदि आप बहुत स्पष्ट होना चाहते हैं तो आप एक ही छिपे हुए चर को दोनों रूपों में एक मूल्य के साथ प्राप्त कर सकते हैं जो आपकी पसंद को बनाने में मदद करेगा।

यह एक दृष्टिकोण है। इस से निपटने के कुछ तरीके हैं मुझे यकीन है।

1

आप दो सरल रूप हो, तो आप इस aproach का उपयोग कर सकते हैं:

आप दो अलग अलग आंशिक दृश्य पैदा करते हैं।

@model CustomerInfoModel 
@using (Ajax.BeginForm("CustomerInfo", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "info", @class = "form-horizontal" })) 
    { 
    <input type="text" class="form-control" name="Name" id="Name" value="@Model.Name" /> 
    <input type="email" class="form-control" name="Email" id="Email" value="@Model.Email" /> 
    <button type="submit" id="save-info" class="btn-medium red">Save</button> 
    } 

और

@model CustomerPasswordChangeModel 
@using (Ajax.BeginForm("CustomerPasswordChange", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "change", @class = "form-horizontal" })) 
{ 
<input type="password" class="form-control" name="OldPassword" id="OldPassword" value="" /> 
<input type="password" class="form-control" name="NewPassword" id="NewPassword" value="" /> 
<button type="submit" id="save-change" class="btn-medium red" autocomplete="off">Save</button> 
} 

अपने माता पिता के विचार में,

@Html.Partial("CustomerInfo", Model.CustomerInfo) 

और नियंत्रक में

@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange) 

:

[HttpPost] 
    public ActionResult CustomerInfo([Bind(Include = "Name,Email")] CustomerInfoModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

    [HttpPost] 
    public ActionResult CustomerPasswordChange([Bind(Include = "OldPassword,NewPassword")] CustomerPasswordChangeModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

यह वही करेगा जो आप करना चाहते हैं।

नोट: getHtmlContent विधि पृष्ठ पर प्रदर्शित होने के लिए एक त्रुटि संदेश उत्पन्न कर रहा है। कुछ खास नहीं है। यदि आवश्यक हो तो मैं इसे साझा कर सकता हूं।

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