2008-10-07 29 views
27

के साथ टेक्स्टबॉक्स सशर्त विशेषता मेरे पास दृढ़ता से टाइप किया गया एमवीसी व्यू कंट्रोल है जो यूआई के लिए ज़िम्मेदार है जहां उपयोगकर्ता क्लाइंट आइटम बना और संपादित कर सकते हैं। मैं चाहता हूं कि वे सृजन पर ClientId को परिभाषित करने में सक्षम हों, लेकिन संपादित न करें, और यह UI में दिखाई देने के लिए।एचटीएमएल। एएसपी.नेट एमवीसी पूर्वावलोकन 5

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new 
{ @readonly = 
    (ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
     ? "readonly" : "false") 
}) 
%> 

ऐसा लगता है कि कोई बात नहीं क्या मूल्य मैं केवल पढ़ने के लिए विशेषता (यहां तक ​​कि "गलत" और "") दे, फ़ायरफ़ॉक्स और IE7 इनपुट पढ़ें:

यह अंत करने के

, मैं निम्न पंक्ति है केवल, जो कष्टप्रद प्रतिद्वंद्वी है। क्या यह आवश्यक नहीं है कि विशेषता को पूरी तरह से छोड़ने के लिए एक अच्छा, टर्नरी-ऑपरेटर-आधारित तरीका है?

उत्तर

35

कठिन समस्या ... हालांकि, अगर आप केवल readonly विशेषता परिभाषित करना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, 
    ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
    ? new { @readonly = "readonly" } 
    : null) 
%> 

आप तो अधिक विशेषताओं को परिभाषित करने के आपके पास दो गुमनाम प्रकार को परिभाषित करना होगा चाहते हैं और गुणों की कई प्रतियां हैं। उदाहरण के लिए, कुछ इस तरह (मैं वैसे भी पसंद नहीं करते, उनमें):

ClientId.Length > 0 
    ? (object)new { @readonly = "readonly", @class = "myCSS" } 
    : (object)new { @class = "myCSS" } 
+0

+1 मेरा पहला शॉट डाली आपत्ति उठाने के बिना दूसरा कोड स्निपेट था।यह आसानी से अनदेखा लेकिन वास्तव में आवश्यक है। –

4

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

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
    <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
    <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> /> 
1

मुझे लगता है कि यह

<%= ((bool) Eval("InRole")) ? "checked" : "" %> 
बजाय leppies में इस बात का

का जवाब होना चाहिए।

<%# ((bool) Eval("InRole")) ? "checked" : "" %> 

कम से कम यह # के साथ मेरे लिए काम नहीं करता है लेकिन यह = के साथ काम करता है। क्या मैंने कुछ गलत किया था? टिप के लिए वैसे भी धन्यवाद :)

0
$ (function() { $ ("[केवल पढ़ने के लिए = 'असत्य']") removeAttr ("केवल पढ़ने के लिए");। });
21

आप कई विशेषताएं निर्धारित करना चाहते हैं, और सशर्त केवल पढ़ने के लिए अन्य विशेषताओं नकल के बिना, आप विशेषताओं के लिए के बजाय शब्दकोश गुमनाम प्रकार का उपयोग कर सकते हैं।

उदा।

Dictionary<string, object> htmlAttributes = new Dictionary<string, object>(); 
htmlAttributes.Add("class", "myCSS"); 
htmlAttributes.Add("data-attr1", "val1"); 
htmlAttributes.Add("data-attr2", "val2"); 
if (Model.LoggedInData.IsAdmin == false) 
{ 
    htmlAttributes.Add("readonly", "readonly"); 
} 


@:User: @Html.TextBoxFor(
    m => m.User, 
    htmlAttributes) 
+1

उत्तर होना चाहिए क्योंकि यह पुनरावृत्ति से बचाता है। –

-2

मैंने ऊपर दिए गए अधिकांश सुझावों का प्रयास किया और अब मैं एक पंक्ति के साथ सबसे सरल पहुंच गया हूं। "ऑब्जेक्ट" प्रकार के रूप में इसे किसी एक को घोषित करके 2 अज्ञात HTML विशेषताएँ ऑब्जेक्ट को संयोजित करें।

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object) 
+0

यह मेरे लिए काम नहीं करता है; '@readonly = false' को अभी भी 'readonly' –

2

युक्ति: यह केवल पढ़ने योग्य/अक्षम विशेषता की उपस्थिति है जो तत्व को ब्राउज़र में केवल पढ़ने या अक्षम करता है।

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ }) 
+0

के रूप में व्याख्या किया गया है, अज्ञात वर्ग को टर्नरी सेशन की पहली स्थिति के लिए ऑब्जेक्ट करने के लिए क्यों डालना चाहिए? इसे चुनौती नहीं दे रहा है, बस इसे समझने की कोशिश कर रहा है। धन्यवाद! – eaglei22

0

मैं इस का उपयोग करें:

@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)