MVC C# modal popup
Asked Answered
S

2

9

ok so i'm trying to figure out how to properly call a modal popup for my page using Controllers as per this post's suggestion

ASP.NET MVC modal dialog/popup best practice

and kinda used this:

http://microsoftmentalist.com/2011/09/14/asp-net-mvc-13-open-window-or-modal-pop-up-and-fill-the-contents-of-it-from-the-controller-method/

I have a view that has a dropdownlist, if the user can't find the item / value that he/she is looking for he can suggest a value (suggest new value link) which is supposed to call the controller and return a popup page with a couple of fields in it.

Here're the objects on the view:

<script type="text/javascript">

        loadpopup = function () 
        {  
window.showModalDialog(‘/NewValue/New′ , "loadPopUp", ‘width=100,height=100′); 
        } 

    </script> 


<%: Html.DropDownList(model => model.ValueId, new selectlist........... %>
<%: Html.ActionLink("Suggest Value", "New", "NewValue", null, new { onclick = 'loadpopup()') %>

The controller that I'm planning to use to return the page:

public class NewValueController : Controller{
   public Actionresult New(){
      return View();
   }
}

Now I'm stuck. I wanted to return a page where I can format it, do i have to return a string ? can't i return an aspx (engin i use) instead, since formatting that would be easier?

Any advice as to which direction i should go is very much appreciated.

Thanks!

Skyscape answered 18/7, 2012 at 5:28 Comment(0)
P
17

You could use the jquery UI Dialog for the popup. Let's have a small setup here.

We would have a view model for the main form:

public class MyViewModel
{
    public string ValueId { get; set; }
    public IEnumerable<SelectListItem> Values 
    { 
        get 
        {
            return new[]
            {
                new SelectListItem { Value = "1", Text = "item 1" },
                new SelectListItem { Value = "2", Text = "item 2" },
                new SelectListItem { Value = "3", Text = "item 3" },
            };
        } 
    }

    public string NewValue { get; set; }
}

a controller:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return Content("thanks for submitting");
    }
}

and a view (~/Views/Home/Index.aspx):

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>" 
%>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <% using (Html.BeginForm()) { %>
        <%= Html.DropDownListFor(x => x.ValueId, Model.Values) %>
        <br/>
        <%= Html.EditorFor(x => x.NewValue) %>
        <%= Html.ActionLink("Suggest Value", "New", "NewValue", null, new { id = "new-value-link" }) %>
        <button type="submit">OK</button>
    <% } %>

    <div id="dialog"></div>

</asp:Content>

then we could take care for the popup. We define a view model for it:

public class NewValueViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

a controller:

public class NewValueController : Controller
{
    public ActionResult New()
    {
        return PartialView(new NewValueViewModel());
    }

    [HttpPost]
    public ActionResult New(NewValueViewModel model)
    {
        var newValue = string.Format("{0} - {1}", model.Foo, model.Bar);
        return Json(new { newValue = newValue });
    }
}

and a corresponding partial view (~/Views/NewValue/New.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.NewValueViewModel>" 
%>

<% using (Html.BeginForm(null, null, FormMethod.Post, new { id = "new-value-form" })) { %>
    <%= Html.EditorFor(x => x.Foo) %>
    <%= Html.EditorFor(x => x.Bar) %>
    <button type="submit">OK</button>
<% } %>

Now all that's left is to write a bit of javascript to wire everything up. We include jquery and jquery ui:

<script src="<%: Url.Content("~/Scripts/jquery-1.5.1.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery-ui-1.8.11.js") %>" type="text/javascript"></script>

and a custom javascript file that will contain our code:

$(function () {
    $('#new-value-link').click(function () {
        var href = this.href;
        $('#dialog').dialog({
            modal: true,
            open: function (event, ui) {
                $(this).load(href, function (result) {
                    $('#new-value-form').submit(function () {
                        $.ajax({
                            url: this.action,
                            type: this.method,
                            data: $(this).serialize(),
                            success: function (json) {
                                $('#dialog').dialog('close');
                                $('#NewValue').val(json.newValue);
                            }
                        });
                        return false;
                    });
                });
            }
        });
        return false;
    });
});
Propene answered 18/7, 2012 at 6:1 Comment(6)
tried it, but atm, instead of it popping up, it just opens a new page. was wondering, which part of the jquery triggers the modal?Skyscape
It's the subscription to the .click() event of the link. Make sure that you have properly included all the 3 javascript files (jquery-1.5.1.min.js, jquery-ui-1.8.11.js and my.js - containing the script I have shown in that order) and that there are no errors in the javascript console.Propene
saw the problem, it was cuz of an extra '});' lol! thanks again!Skyscape
btw, sorry for the follow up questions. but,i wanted to update the <%= Html.DropDownListFor(x => x.ValueId, Model.Values) %>with the New Value that I added.Will the return return Json(new { newValue = newValue }); handle that? how will it become a selectlistitem for the dropdown, just curious.Skyscape
You could add a new <option> item to the dropdown in the success handler instead of setting the NewValue field.Propene
hey man, sorry to get back to you so late, i tried to just refresh the page to get over the problem,but i feel like it's better if i just refresh the dropdown? wanted to have the list in order so refreshing it would be ideal, unless adding the extra option at the bottom is the only option then maybe ill go with that.Skyscape
T
-2
$('#CheckGtd').click(function () {
    if ($(this).is(":checked"))
        $("#tbValuationDate").attr("disabled", false);
    else
        $("#tbValuationDate").attr("disabled", "disabled");
});
Tarango answered 20/8, 2014 at 7:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.