سؤال

ولدي MVC تحكم عرض كتابة بشدة وهو المسؤول عن واجهة المستخدم حيث يمكن للمستخدمين إنشاء وتحرير عناصر العميل. أود لها أن تكون قادرة على تحديد ClientId على خلق، ولكن ليس تعديل، وهذا ينعكس في واجهة المستخدم.

لهذه الغاية، لا بد لي السطر التالي:

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

ويبدو أنه بغض النظر عن قيمة ما أعطي سمة للقراءة فقط (حتى "كاذبة" و "")، فايرفوكس وIE7 جعل مدخلات للقراءة فقط، وهو مزعج مكافحة بديهية. هناك، الثلاثي مشغل القائم على طريقة لطيفة لإسقاط السمة تماما إن لم يكن هو مطلوب منها؟

هل كانت مفيدة؟

المحلول

ومشكلة صعبة ... ومع ذلك، إذا كنت تريد أن تعرف فقط السمة 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" }

نصائح أخرى

إذا كنت تريد تحديد عدة سمات، وللقراءة فقط مشروطة على دون تكرار سمات أخرى ، أو يمكنك استخدام قاموس بدلا من أنواع مجهولة السمات.

ومنها مثلا.

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)  

والبديل هو فقط لأنها تنبعث HTML سهل القديمة. نعم، سوف محرر تجعلك تعتقد أنك على خطأ، ولكن يبدو أن يحدث في كثير من الأحيان الى حد بعيد مع VS2008SP1. هذا المثال هو على وجه التحديد لمربعات التي يبدو أن تضيع تماما في CTP5، لكنه يتيح لك فكرة عن كيفية تنبعث منها سمات المشروطة.

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

نصيحة: ه مجرد وجود سمة للقراءة فقط / المعوقات التي تجعل من عنصر للقراءة فقط أو تعطيلها في المتصفح

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

وأعتقد أنه يجب أن يكون

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

وبدلا من ذلك في leppies الإجابة.

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

وعلى الأقل لم يعمل بالنسبة لي مع # لكنه يعمل مع =. هل قمت بأي تصرف خاطئ؟ شكرا لطرف على أي حال:)

$ (وظيفة () {   $ ( "[للقراءة فقط = 'كاذبة']") removeAttr ( "للقراءة فقط")؛  })؛

وأنا استخدم هذا:

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

وحاولت معظم الاقتراحات أعلاه وأنا الآن قد وصلت إلى أبسط مع خط واحد. الجمع بين 2 أتش تي أم أل مجهول سمات الكائن بإعلان تذوي واحد منه كنوع "كائن".

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top