javascript - व्यू से जावास्क्रिप्ट तक सी#मॉडल पास करें




c# asp.net-mvc razor model (5)

मैं अपने दृश्य में यह ViewModel पास कर रहा हूं:

  public class DashboardViewModel
  {
    public List<UserTask> UserTasks {get; set;}

    public List<WorkItem> WorkItems {get; set;}
  }    

और दृश्य के भीतर से मैं इस तरह से वर्कआईटम्स के माध्यम से चल रहा हूं:

 @foreach (var item in Model.WorkItems)
 {
    @item.Name
    @item.HoursLogged
    <button value="@item">UPDATE</button>
 }

जब मैं बटन पर क्लिक करता हूं, तो एक jQuery फ़ंक्शन एक मोडल खोल रहा है।

सभी आइटम इन्फोस को प्रदर्शित करने के लिए मुझे मदल को पास करना होगा

यह जावास्क्रिप्ट फ़ंक्शन है:

$(buttonEl).click(function () {
   //code to open modal
   var item = this.value;
});

"This.value" में पारित किया जाने वाला मान ऑब्जेक्ट नहीं है, लेकिन वर्कइटम के नेमस्पेस के साथ एक स्ट्रिंग है।

मैंने इनलाइन ऑनक्लिक फ़ंक्शन के साथ भी प्रयास किया है:

<button onclick="openModal('@item')">UPDATE</button>

लेकिन एक ही परिणाम के साथ

कोई उपाय?


Answers

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

@{ var counter = 0;}
@foreach (var item in Model.WorkItems)
 {
    @item.Name
    <button class="updateBtns" data-index="@counter">UPDATE</button>
    counter++;
 }

और एक ही उस्तरा दृश्य में, यह जावास्क्रिप्ट है जहां आप Model.WorkItems को क्रमबद्ध कर देंगे। Model.WorkItems संग्रह एक जावास्क्रिप्ट सरणी के लिए और इसे एक चर में संग्रहीत करते हैं

<script>
  $(function() { 

     var dataArr = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.WorkItems));
      $(".updateBtns").click(function (e) {
          e.preventDefault();

          var selectedItem = dataArr[$(this).data("index")];
          console.log(selectedItem);
      });    
  });    
</script>

मैं आम तौर पर इसका इस्तेमाल एमवीसी से जावास्क्रिप्ट करने के लिए करता हूं!

@Html.Raw(Json.Encode(item))

@item in View सामान्य स्ट्रिंग के रूप में आइटम मुद्रित करेगा (item.ToString ())। मुझे लगता है कि आप क्या चाहते हैं स्ट्रिंग को जावास्क्रिप्ट ऑब्जेक्ट के रूप में पार्स करना है, है ना?

एक दृष्टिकोण अपने मॉडल में एक विधि को लागू करना है, जैसे JSON.stringify ()। विधि JSON स्ट्रिंग को सी # मॉडल को पार्स कर सकती है:

{
 "Name" : "Scott",
 "HoursLogged" : "2"
}

उसके बाद आप JSON ऑब्जेक्ट में स्ट्रिंग को JSON.parse () का उपयोग करके पार्स कर सकते हैं। इस स्थिति में, आप JSON ऑब्जेक्ट का उपयोग कर सकते हैं। कुछ विचार:

सी#:

public class Item
{
 public string Name { get; set; }
 public int HoursLogged { get; set; }
 public string ToJsonString()
 {
  return "{" + "\"Name\":" + Name + ",HoursLogged:" + HoursLogged + "}";
 }
}

जे एस:

var jsonStr = '@item.ToJsonString()';
var jsonObj = JSON.parse(jsonStr);
console.log(jsonObj.Name);
console.log(jsonObj.HoursLogged);

आप न्यूटन को सी # मॉडल को स्ट्रिप करने के लिए भी उपयोग कर सकते हैं।


यहाँ पर क्या हो रहा है यह समझने के लिए आपको शायद कुछ कदम वापस लेना चाहिए। एक वेब अनुरोध सचमुच स्ट्रिंग्स का एक गुच्छा है, एमवीसी। नेट कुछ सामान की कोशिश करता है और ऑब्जेक्ट्स को सीधे स्ट्रिंग स्ट्रिंग में इस्तेमाल करने से संक्रमण को कम करता है, लेकिन जैसा कि आप देख सकते हैं कि यह सब कुछ नहीं कर सकता तो ले-दूर यह है कि आप चीजों से निपटने के लिए, जैसे कि पृष्ठ पर दिए गए सभी स्ट्रिंग्स हैं।

कहा जा रहा है कि इस समस्या को हल करने के कई तरीके हैं। आप अपने सभी वर्कइटम ऑब्जेक्ट को जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करने से पहले जावास्क्रिप्ट एरे से बाहर खींच सकते हैं। या जो मैं व्यक्तिगत रूप से करना चाहता हूं बस बटन में ऑब्जेक्ट का आईडी होता है और सर्वर से सबसे हालिया डेटा प्राप्त करने के लिए एजेक्स कॉल करता है।

पीछे की ओर:

[HttpPost]
public string GetWorkItemById(int id)
{

//get or create WorkItem here
WorkItem workItem = new WorkItem(id);
workItem.Name = "Foobar";
workItem.HoursLogged = "127001";

return Newtonsoft.Json.JsonConvert.SerializeObject(workItem);
}

फ़्रंट एंड:

    $(buttonEl).click(function () {    
    var id = this.value; //assuming you store the id in the button's value
    $.ajax({
          type: "POST",
          url: "@(Url.Action("GetWorkItemById"))",
          data: ({
                    Id:id
                 }),
          success: success,
          dataType: dataType, 
          success: function(result){
                var name = result.Name; // Foobar
                var hoursLogged = result.HoursLogged; // 127001
                //populate text fields using jquery
          }
        })
    });

आपके प्रश्न शीर्षक में आपके द्वारा उपयोग की जाने वाली अवधि Remove a property from a JavaScript object , जिसे कुछ अलग तरीकों से व्याख्या किया जा सकता है। एक इसे पूरी मेमोरी और ऑब्जेक्ट कुंजियों की सूची के लिए निकालना है या दूसरा इसे अपने ऑब्जेक्ट से निकालना है। जैसा कि कुछ अन्य उत्तरों में इसका उल्लेख किया गया है, delete कीवर्ड मुख्य भाग है। मान लें कि आपके पास अपनी वस्तु है:

myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

यदि तुम करो:

console.log(Object.keys(myJSONObject));

नतीजा होगा:

["ircEvent", "method", "regex"]

आप अपनी ऑब्जेक्ट कुंजी से उस विशिष्ट कुंजी को हटा सकते हैं जैसे:

delete myJSONObject["regex"];

फिर ऑब्जेक्ट.कीज़ Object.keys(myJSONObject) का उपयोग करके आपकी ऑब्जेक्ट कुंजी होगी:

["ircEvent", "method"]

लेकिन मुद्दा यह है कि यदि आप स्मृति के बारे में परवाह करते हैं और आप पूरे ऑब्जेक्ट को स्मृति से हटा देते हैं, तो इसे कुंजी हटाने से पहले इसे शून्य पर सेट करने की अनुशंसा की जाती है:

myJSONObject["regex"] = null;
delete myJSONObject["regex"];

यहां अन्य महत्वपूर्ण बिंदु एक ही वस्तु के आपके अन्य संदर्भों के बारे में सावधान रहना है। उदाहरण के लिए, यदि आप एक चर बनाते हैं जैसे:

var regex = myJSONObject["regex"];

या इसे किसी अन्य ऑब्जेक्ट में एक नए पॉइंटर के रूप में जोड़ें जैसे:

var myOtherObject = {};
myOtherObject["regex"] = myJSONObject["regex"];

फिर भी यदि आप इसे अपने ऑब्जेक्ट myJSONObject से हटा myJSONObject , तो उस विशिष्ट ऑब्जेक्ट को स्मृति से हटाया नहीं जाएगा, क्योंकि regex चर और myOtherObject["regex"] पास अभी भी उनके मान हैं। तो हम वस्तु को स्मृति से निश्चित रूप से कैसे हटा सकते हैं?

जवाब आपके कोड में आपके सभी संदर्भों को हटाना होगा , उस वस्तु को इंगित करता है और उस ऑब्जेक्ट के नए संदर्भ बनाने के लिए var कथन का भी उपयोग नहीं करता हैvar बयानों के बारे में यह आखिरी बिंदु, सबसे महत्वपूर्ण मुद्दों में से एक है जिसका हम आम तौर पर सामना कर रहे हैं, क्योंकि var कथनों का उपयोग करने से बनाए गए ऑब्जेक्ट को हटा दिया जा सकता है।

जिसका अर्थ है कि इस मामले में आप उस ऑब्जेक्ट को हटाने में सक्षम नहीं होंगे क्योंकि आपने एक var स्टेटमेंट के माध्यम से regex वैरिएबल बनाया है, और यदि आप ऐसा करते हैं:

delete regex; //False

परिणाम false होगा, जिसका अर्थ है कि आपके डिलीट स्टेटमेंट को आपके द्वारा अपेक्षित रूप से निष्पादित नहीं किया गया है। लेकिन अगर आपने पहले उस चर को नहीं बनाया था, और आपके पास केवल myOtherObject["regex"] अंतिम संदर्भ के रूप में myOtherObject["regex"] , तो आप इसे इस तरह से हटाकर ऐसा कर सकते थे:

myOtherObject["regex"] = null;
delete myOtherObject["regex"];

दूसरे शब्दों में, जैसे ही आपके कोड में कोई संदर्भ नहीं छोड़ा जाता है, उस वस्तु पर इंगित होने पर कोई जावास्क्रिप्ट ऑब्जेक्ट मारे जाते हैं।

अद्यतन: @AgentME के ​​लिए धन्यवाद:

इसे हटाने से पहले किसी संपत्ति को शून्य पर सेट करना कुछ भी पूरा नहीं करता है (जब तक ऑब्जेक्ट ऑब्जेक्ट.सेल द्वारा सील नहीं किया जाता है और हटाए जाने में विफल रहता है। आमतौर पर यह मामला आमतौर पर तब तक नहीं होता जब तक आप विशेष रूप से प्रयास नहीं करते)।

अधिक जानकारी प्राप्त करने के लिए Object.seal: Object.seal()





javascript c# asp.net-mvc razor model