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!

Community
  • 1
  • 1
gdubs
  • 2,724
  • 9
  • 55
  • 102

2 Answers2

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;
    });
});
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
  • 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? – gdubs Jul 18 '12 at 13:02
  • 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. – Darin Dimitrov Jul 18 '12 at 13:34
  • saw the problem, it was cuz of an extra '});' lol! thanks again! – gdubs Jul 18 '12 at 21:41
  • 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. – gdubs Jul 19 '12 at 03:07
  • You could add a new ` – Darin Dimitrov Jul 19 '12 at 05:18
  • 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. – gdubs Aug 01 '12 at 21:26
-2
$('#CheckGtd').click(function () {
    if ($(this).is(":checked"))
        $("#tbValuationDate").attr("disabled", false);
    else
        $("#tbValuationDate").attr("disabled", "disabled");
});
arulmr
  • 8,620
  • 9
  • 54
  • 69