2013-03-23 3 views
5

मुझे लगता है कि संपादक का एक विस्तृत संस्करण होना बहुत उपयोगी होगा HTML संपादक के लिए जो स्वचालित रूप से नॉकआउट जेएस के लिए मूल्य डेटा बाइंडिंग लिखता है।संपादक एचटीएमएल हेल्पर के साथ नॉकआउट

यह क्लाइंट साइड व्यू मॉडल और सर्वर साइड व्यू मॉडल समान होगा जहां से मैं क्लाउड साइड व्यू मॉडल को पहले से ही ऑटो मैपिंग का उपयोग कर और एजेक्स के माध्यम से व्यूमोडेल प्राप्त कर रहा हूं।

क्या किसी और ने ऐसा कुछ करने का प्रयास किया है, या क्या ऐसी कोई परियोजनाएं हैं जिनमें कुछ भी शामिल है जो मैं सोच रहा हूं?

इसका लाभ यह होगा कि जब रिफैक्टरिंग डेटा बाध्य मूल्यों को याद नहीं किया जाएगा तो कोई खतरा नहीं होगा।

+1

क्या आप http://knockoutmvc.com/ के बारे में जानते हैं? हालांकि मैंने इसके बारे में बुरी चीजें सुनाई हैं http://stackoverflow.com/questions/11618042/is-there-a-reason-i-would-use-knockout-mvc-instead-of-knockout-js। हालांकि आप शायद इससे कुछ एक्सटेंशन चुरा सकते हैं :) –

+0

मैं उस पर एक नज़र डालेंगे –

+0

मैंने एमवीसी 3 में इस पीठ के लिए एक समान परियोजना शुरू की, लेकिन जब हमने एकल पृष्ठ ऐप टेम्पलेट के बारे में सुना तो एमवीसी 4 में नॉकआउट एकीकरण आ रहा है। इस पर काम करना बंद कर दिया। दुर्भाग्य से, यह पूरा नहीं हुआ और हम कभी भी परियोजना पर वापस नहीं आये। अब, मुझे विश्वास है कि सुविधा एसपी 2 में लौट रही है (या वापस आ गई है)। –

उत्तर

3

हमने इन लाइनों के साथ कुछ किया है, यह बिल्कुल सही है, और हमारे कस्टम एक्सटेंशन में हमारे पास बहुत कुछ है, लेकिन मैंने सार निकाला।

using System.Web.Mvc.Html; 

namespace System.Web.Mvc 
{ 
    public static class EditorForExtensions 
    { 
     public static MvcHtmlString TextBoxForViewModel<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
     { 
      ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 

      var htmlAttributes = HtmlAttributesForKnockout(metadata); 

      return htmlHelper.TextBoxFor(expression, htmlAttributes); 
     } 

     private static Dictionary<string, object> HtmlAttributesForKnockout(ModelMetadata metadata) 
     { 
      var htmlAttributes = new Dictionary<string, object>(); 

      var knockoutParameter = String.Format("value: {0}", metadata.PropertyName); 

      htmlAttributes.Add("data-bind", knockoutParameter); 

      return htmlAttributes; 
     } 
    } 
} 

यह तो इस्तेमाल किया जा सकता है जैसे:

@Html.TextBoxForViewModel(m => m.Name) 
1

में छोड़ करने के लिए देख किसी के लिए ऊपर चाड के जवाब देने के लिए htmlAttributes अधिभार जोड़ना चाहते थे और यह काम किया है। अन्य सभी सहायकों को इन उदाहरणों से बहुत आसानी से बनाया जा सकता है। (धन्यवाद चाड, आपके एक्सटेंशन ने नॉकआउट का उपयोग करने में अपने संक्रमण को कम करने में मदद की!)

using System.Collections.Generic; 
using System.Linq.Expressions; 
using System.Web.Mvc.Html; 

namespace System.Web.Mvc { 
    public static class KnockoutExtensions { 
     public static MvcHtmlString KnockoutTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { 
      var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
      var htmlAttributes = HtmlAttributesForKnockout(metadata); 
      return htmlHelper.TextBoxFor(expression, htmlAttributes); 
     } 

     public static MvcHtmlString KnockoutTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object attributes) { 
      // convert passed anonymous object (attributes) into IDictionary<string,object> to pass into attribute parser 
      var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(attributes) as IDictionary<string, object>; 
      var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 

      var htmlAttributes = HtmlAttributesForKnockout(metadata, attrs); 

      return htmlHelper.TextBoxFor(expression, htmlAttributes); 
     } 

     private static Dictionary<string, object> HtmlAttributesForKnockout(ModelMetadata metadata, IEnumerable<KeyValuePair<string, object>> attributes = null) { 
      var htmlAttributes = new Dictionary<string, object>(); 

      var knockoutParameter = String.Format("value: {0}", metadata.PropertyName); 
      htmlAttributes.Add("data-bind", knockoutParameter); 

      if (attributes != null) foreach (var attr in attributes) htmlAttributes.Add(attr.Key, attr.Value); 

      return htmlAttributes; 
     } 
    } 
} 
संबंधित मुद्दे