locked
html.BeginForm שיחזור לדף עצמו עם כל הנתונים + חדשים RRS feed

  • שאלה

  • יש לי view שמציג נתונים מתוך viewModel 

    המשתמש צריך להזין נתונים - הנתונים נשלחים לaction ומתקבלים שם כ viewModel

    בaction אני עושה חישוב ומזינה את הנתונים לשדות נוספים שהיו ריקים בviewModel ושולחת חזרה..

    מה שקורה שאני מקבלת את הדף חזרה ועם הנתונים שהלקוח הזין, אבל לא מציג לי את השדות שהוא חישב בaction למרות 

    שבדיבג ראיתי שהview כן קיבל את ה viewModel המעודכן..

    איך עושים את זה? ניסיתי בaction שיחזיר ActionResult ניסיתי שיחזיר string והJQuery יזין את הנתונים שהתקבלו.. ושום דבר לא עובד:

    הנה הקוד:

    בקונטרולר:

            public ActionResult MCalculator()
            {
                MCalculatorViewModel MCViewMode = new MCalculatorViewModel();
    
    
                return View(MCViewMode);
            }
    
            [HttpPost]
            public ActionResult MCalculator(MCalculatorViewModel mDtls)
            //public MCalculatorViewModel MCalculator(MCalculatorViewModel mDtls)
            public string MCalculator(MCalculatorViewModel mDtls)
            {
                
               //Some Code
    
                // Adding Value to the viewModel class
                mDtls.LowRange = Price + range;
                mDtls.HighRange = Price - range;
    
             
                //return View();
                return View("MCalculator", mDtls);
                //string returnArr =  mDtls.LowRange.ToString() + ";" + mDtls.HighRange.ToString();
            }

    view:

    @model Me.Views.ViewModels.MCalculatorViewModel
    
    @using (Html.BeginForm())
    {
    
       <div>
            @Html.LabelFor(Model => Model.RNum)
            @Html.TextBoxFor(Model => Model.RNum)
        </div>
        
        @*more TextBox.. *@
        
        
        @* פה אמור להיות התוצאה *@
         <div style = " float:right; width: 100px;">
            @Html.LabelFor(Model => Model.LowRange)
            @Html.TextBoxFor(Model => Model.LowRange)
                
        </div>
        <div style = " float:right; width: 100px;">
            @Html.LabelFor(Model => Model.HighRange)
            @Html.TextBoxFor(Model=>Model.HighRange)
        </div>
    
    }

    יום רביעי 20 יוני 2012 13:51

תשובות

  • נמחקה לי התגובה בטעות (טעות שלי LOL אני מחקתי... בכל מקרה טוב שהספקת לקרוא... זה העיקר)

    נעבור לבעיה הבאה...

    תחילה נבהיר שאגקס היא טכנטולוגיה שלא מבינה כלום כמו ששום טבנולוגיה לא מבינה כלום אלא רק מאפשרת לנו לבצע את מה שאנחנו רוצים. לכן עלינו להבין ולהעזר בטכנולוגיה כדי לבצע

    נקודה נוספת: אגקס קיים יותר מ 10 שנים והמושג נכנס כביכול בקשר של דוט-נט או אובייקטים מובנים כאלה ואחרים או סביבות מוכנות כמו JQUERY אבל כאמור אגקס אפשר למצוא במערכת שפיתחתי לאוניברסיטת ת"א לפני כעשור גם. זה בסך הכל קוד של 2-3 שורות ב JS אם רוצים לכתוב לבד ולא להעזר בספריות מוכנות.

    אז למה אני מספר את כל ההיסטוריה?!? כי ברור שאפשר לעבוד בלי JQUERY ואפשר לעבוד בלי ajax.beginform שזה helper של מייקרוסופט שמבוסס על אגקס של מיקירוסופט שזה קוד JS שמבוסס על ספריית JQUERY (ולכן לא יעבוד בלי JQUERY) שהיא בעצמה קוד JS רגיל. אם את רוצה את יכולה לכתוב פונקציה אגקס לבד והתשובה היא שכמובן שאת לא חייבת לעבוד עם ajax.beginform

    * אני מציע לא לעבוד עם ספריות מוכנות בלי לפחות לעבור עליהן בצורה מהירה אם אפשר (על הקוד). זה ייתן הבנה מעמיקה יותר על מה שקורה :-)


    signature


    • נערך על-ידי pituachMVP, Editor יום שישי 22 יוני 2012 15:55
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 26 יוני 2012 08:07
    יום שישי 22 יוני 2012 15:55
    משיב

כל התגובות

  • כמו שפיתוח הציע לי..

    העברתי את הטופס לאגקס:

    @using (Ajax.BeginForm("MCalculator",  new AjaxOptions
    { 
        HttpMethod="POST",
        InsertionMode= InsertionMode.Replace,
        UpdateTargetId = "result" 
    }))
    {

    ובjquery קיבלתי תוצאה כstring והצגתי אותה בresult:

     $('form').submit(function () {
            if ($(this).valid()) {
                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result) {
                     
                        $("#result").html(result);
                     
                    }
                });
            }
            return false;
        });

    אז עכשיו זה עובד. אבל עדיין אני לא מרוצה.. כי נראה לי שיש פה איזה קוד מיותר..

    לפי הבנתי הajax.beginForm היה אמור להבין לבד איך לשתול את התוצאות, הרי בשביל זה אמרתי לו מי הtargetID 

    אז למה אני צריכה פה את הjquery 

    ובנוסף הajax.beginform היה אמור להבין איך להישלח לקונטרולר אז שוב הjquery מיותר.. 

    אבל עדיין הצורה המובאית פה - זה הדרך היחידה שזה אכן עובד לי.. אם למשהו יש רעיון אחר אשמח לשמוע.

    יום טוב

    יום חמישי 21 יוני 2012 11:22
  • נמחקה לי התגובה בטעות (טעות שלי LOL אני מחקתי... בכל מקרה טוב שהספקת לקרוא... זה העיקר)

    נעבור לבעיה הבאה...

    תחילה נבהיר שאגקס היא טכנטולוגיה שלא מבינה כלום כמו ששום טבנולוגיה לא מבינה כלום אלא רק מאפשרת לנו לבצע את מה שאנחנו רוצים. לכן עלינו להבין ולהעזר בטכנולוגיה כדי לבצע

    נקודה נוספת: אגקס קיים יותר מ 10 שנים והמושג נכנס כביכול בקשר של דוט-נט או אובייקטים מובנים כאלה ואחרים או סביבות מוכנות כמו JQUERY אבל כאמור אגקס אפשר למצוא במערכת שפיתחתי לאוניברסיטת ת"א לפני כעשור גם. זה בסך הכל קוד של 2-3 שורות ב JS אם רוצים לכתוב לבד ולא להעזר בספריות מוכנות.

    אז למה אני מספר את כל ההיסטוריה?!? כי ברור שאפשר לעבוד בלי JQUERY ואפשר לעבוד בלי ajax.beginform שזה helper של מייקרוסופט שמבוסס על אגקס של מיקירוסופט שזה קוד JS שמבוסס על ספריית JQUERY (ולכן לא יעבוד בלי JQUERY) שהיא בעצמה קוד JS רגיל. אם את רוצה את יכולה לכתוב פונקציה אגקס לבד והתשובה היא שכמובן שאת לא חייבת לעבוד עם ajax.beginform

    * אני מציע לא לעבוד עם ספריות מוכנות בלי לפחות לעבור עליהן בצורה מהירה אם אפשר (על הקוד). זה ייתן הבנה מעמיקה יותר על מה שקורה :-)


    signature


    • נערך על-ידי pituachMVP, Editor יום שישי 22 יוני 2012 15:55
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 26 יוני 2012 08:07
    יום שישי 22 יוני 2012 15:55
    משיב