2012-09-18 8 views
6

में एक वैकल्पिक पैरामीटर पारित करने के लिए यह काम करता है:कैसे ActionResult

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 

अगर मैं cmpPhn वैकल्पिक बनाने:

public ActionResult Edit(int id, CompPhone? cmpPhn) 

मैं "त्रुटि 1 प्रकार 'MyProject.Models.CompPhone' होना चाहिए सामान्य प्रकार या विधि 'System.Nullable' में पैरामीटर 'टी' के रूप में इसका उपयोग करने के लिए एक गैर-शून्य मूल्य मान प्रकार।

मैं वैकल्पिक इनपुट विधि में यह इनपुट पैरामीटर कैसे बना सकता हूं?

यहाँ दृश्य मॉडल

public class MyViewModel : IValidatableObject 
{ 
... 
public CompPhone CmpPhnF { get; set; }  
... 
} 

कॉलिंग विधि

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult PhoneTest(MyViewModel vM) 
{ 
    if (ModelState.IsValid) 
    { var cmpPhn = vM.CmpPhnF; 
    return RedirectToAction("Edit", new { id = vM.AcntId, cmpPhn }); 
    } 
    ... 
} 

उत्तर

12

आप इसे वैकल्पिक नहीं कर रहे हैं, तो आप यह nullable कर रहे हैं। इसे वैकल्पिक बनाने के लिए आपको पैरामीटर के लिए डिफ़ॉल्ट मान परिभाषित करने की आवश्यकता है। (इसका एकमात्र के लिए सी # 4.0 या इसके बाद के संस्करण उपलब्ध):

public ActionResult Edit(int id, CompPhone cmpPhn = null) 

अपने वर्तमान कोड Nullable होने के लिए निर्दिष्ट करने जाता है और ऐसा लगता है कि CompPhoneएक वर्ग एक मान प्रकार नहीं है, और Nullable नहीं हो सकता। जहां CompPhone होना चाहिए एक struct

+0

धन्यवाद हबीब। मैं rablinz पर आपका जवाब पसंद करता हूं क्योंकि इसे विधि को डुप्लिकेट करने की आवश्यकता नहीं है। और हाँ कॉम्पफोन एक वर्ग है। – Joe

+0

@ जो, रैब्लिंज का उत्तर भी मान्य है, लेकिन यदि आप नेट फ्रेमवर्क 4.0 या उसके बाद का उपयोग कर रहे हैं तो यह सी # 4.0 के साथ आता है जिसमें विधि के लिए डिफ़ॉल्ट पैरामीटर विकल्प होता है। उस संस्करण से पहले, आपको rablinz के उत्तर – Habib

+0

पर अनुकूलित करना होगा मैंने अपने प्रश्न में कॉलिंग विधि जोड़ दी है। आपने उत्तर दिया कि कक्षा को विधि में कैसे लेना है। मेरे पास एक विधि से कक्षा को पारित करने का एक अनुवर्ती प्रश्न है। जब मैं कॉलिंग विधि आईडी को डीबग करता हूं लेकिन सीएमपीएनएन रूट मानों में नहीं जोड़ा जाता है। धन्यवाद – Joe

1

मैं हबीब से सहमत हैं, आप पैरामीटर nullable बना रहे हैं

CompPhone? cmpPhnNullable<CompPhone> के बराबर है।

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

public ActionResult Edit(int id) 
{ 
    var vM = new MyViewModel(); 
    vM.CmpPhnF = defaultValue; 
    ... 
} 

और

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 
संबंधित मुद्दे