How to use jquery or ajax to update razor partial view in c#/asp.net for a MVC project

123,068

Solution 1

You'll need AJAX if you want to update a part of your page without reloading the entire page.

main cshtml view

<div id="refTable">
     <!-- partial view content will be inserted here -->
</div>

@Html.TextBox("yearSelect3", Convert.ToDateTime(tempItem3.Holiday_date).Year.ToString());
<button id="pY">PrevY</button>

<script>
    $(document).ready(function() {
        $("#pY").on("click", function() {
            var val = $('#yearSelect3').val();
            $.ajax({
                url: "/Holiday/Calendar",
                type: "GET",
                data: { year: ((val * 1) + 1) }
            })
            .done(function(partialViewResult) {
                $("#refTable").html(partialViewResult);
            });
        });
    });
</script>

You'll need to add the fields I have omitted. I've used a <button> instead of submit buttons because you don't have a form (I don't see one in your markup) and you just need them to trigger javascript on the client side.

The HolidayPartialView gets rendered into html and the jquery done callback inserts that html fragment into the refTable div.

HolidayController Update action

[HttpGet]
public ActionResult Calendar(int year)
{
    var dates = new List<DateTime>() { /* values based on year */ };
    HolidayViewModel model = new HolidayViewModel {
        Dates = dates
    };
    return PartialView("HolidayPartialView", model);
}

This controller action takes the year parameter and returns a list of dates using a strongly-typed view model instead of the ViewBag.

view model

public class HolidayViewModel
{
    IEnumerable<DateTime> Dates { get; set; }
}

HolidayPartialView.csthml

@model Your.Namespace.HolidayViewModel;

<table class="tblHoliday">
    @foreach(var date in Model.Dates)
    {
        <tr><td>@date.ToString("MM/dd/yyyy")</td></tr>
    }
</table>

This is the stuff that gets inserted into your div.

Solution 2

The main concept of partial view is returning the HTML code rather than going to the partial view it self.

[HttpGet]
public ActionResult Calendar(int year)
{
    var dates = new List<DateTime>() { /* values based on year */ };
    HolidayViewModel model = new HolidayViewModel {
        Dates = dates
    };
    return PartialView("HolidayPartialView", model);
}

this action return the HTML code of the partial view ("HolidayPartialView").

To refresh partial view replace the existing item with the new filtered item using the jQuery below.

$.ajax({
                url: "/Holiday/Calendar",
                type: "GET",
                data: { year: ((val * 1) + 1) }
            })
            .done(function(partialViewResult) {
                $("#refTable").html(partialViewResult);
            });
Share:
123,068

Related videos on Youtube

user2029505
Author by

user2029505

Updated on July 09, 2022

Comments

  • user2029505
    user2029505 almost 2 years

    In a MVC partial view file, I build one Html.TextBox and two submit buttons. These two buttons will increase/decrease the Html.TextBox value once clicked. The Html.TextBox displayed value will change accordingly.However, once I need to update the #refTable div based on the new value after click. The page or section never updated. Codes are below, where some comments are added for explanation purpose. Thanks for your help.

    //******* cshtml file **********//

    <body>
    </body>
    
    <input type="submit" value="PrevY" name="chgYr2" id="pY" />
    @{
        var tempItem3 = Model.First(); // just give the first entry from a database, works.
        if (ViewData["curSel"] == null)
        {
        @Html.TextBox("yearSelect3", Convert.ToDateTime(tempItem3.Holiday_date).Year.ToString());  
        ViewBag.selYear = Convert.ToDateTime(tempItem3.Holiday_date).Year; // just initial value, works
        ViewData["curSel"] = Convert.ToDateTime(tempItem3.Holiday_date).Year;
        }
        else
        {
        @Html.TextBox("yearSelect3", ViewData["curSel"].ToString());
        } 
    }
    <input type="submit" value="NextY" name="chgYr2" id="nY" />
    
    
    <script type="text/javascript">
        $(document).ready(function () {
            $(document).on("click", "#nY", function () {
                var val = $('#yearSelect3').val();
                $('#yearSelect3').val((val * 1) + 1);
                var dataToSend = {
                    id: ((val * 1) + 1)
                }
                // add some jquery or ajax codes to update the #refTable div
                // also ViewBag.selYear need to be updated as ((val * 1) + 1)
                // like:   ViewBag.selYear = ((val * 1) + 1);
                // any similar temp variable is fine
            });
    
            });
            $(document).on("click", "#pY", function () {
                var val = $('#yearSelect3').val();
                $('#yearSelect3').val((val * 1) - 1);
                var dataToSend = {
                    id: ((val * 1) - 1)
                }
    
            });
        });
    </script>
    
    
    
    <span style="float: right"><a href="/">Set Holiday Calender for 2013</a></span>
    <span id="btnAddHoliday">@Html.ActionLink("Add Holiday", "Create", null, new { id = "addHilBtn" })</span>
    
    <div id="refTable">
        <table class="tblHoliday" style="width: 100%;">
                <th>
                    Holiday
                </th>
                <th>
                    Dates
                </th>
                <th>Modify</th>
                <th>Delete</th>
            </tr>
    
            @foreach (var item in Model)
            {
    
                if (    Convert.ToDateTime(item.Holiday_date).Year == ViewBag.selYear)
                // if the ViewBag.selYear is hard code, this selection "works"
                {
                <tr>                
                    <td>
                        @Html.DisplayFor(modelItem => item.Holiday_Name)
                    </td>               
                    <td>
                        @item.Holiday_date.Value.ToString("MM/dd/yyyy")
                    </td>
                    <td>
                        @Html.ActionLink("Edit", "Edit", new {  })
                    </td>
                    <td>
                        @Html.ActionLink("Delete", "Delete", new {  })
                    </td>
                </tr>
                }
            }
    
        </table>
    </div>
    
    • Jasen
      Jasen over 10 years
      Where's the AJAX code that you have tried?
    • user2029505
      user2029505 over 10 years
      I took the ajax out, since these ajax are used for calling MVC actions. I tried to refresh the webpage via execute MVC actions, in vain.
  • Jorge
    Jorge over 10 years
    ok, I like you're solution but why use done? why don't just use success callback of ajax?
  • Jasen
    Jasen over 10 years
    Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are deprecated as of jQuery 1.8. To prepare your code for their eventual removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead. jQuery.ajax()
  • user2029505
    user2029505 over 10 years
    Hello Jorge, Thank you very much for your help. Appreciate!! As to the using of "callback of ajax". Sorry, I am still new to ajax and MVC, and need some time to digest them.
  • Ram
    Ram over 7 years
    .done(function(partialViewResult) { $("#refTable").html(partialViewResult); }); Explain above code block in detail.