【问题标题】:MVC C# modal popupMVC C# 模式弹出窗口
【发布时间】:2012-07-17 02:23:47
【问题描述】:

好的,所以我正在尝试弄清楚如何根据这篇文章的建议使用控制器为我的页面正确调用模式弹出窗口

ASP.NET MVC modal dialog/popup best practice

有点用这个:

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/

我有一个包含下拉列表的视图,如果用户找不到他/她正在寻找的项目/值,他可以建议一个应该调用控制器并返回的值(建议新值链接)一个弹出页面,其中包含几个字段。

这是视图上的对象:

<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()') %>

我打算用来返回页面的控制器:

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

现在我被困住了。我想返回一个可以格式化的页面,我必须返回一个字符串吗?我不能返回一个 aspx(我使用的引擎),因为格式化会更容易吗?

非常感谢任何关于我应该去哪个方向的建议。

谢谢!

【问题讨论】:

    标签: asp.net-mvc jquery modal-dialog jquery-dialog


    【解决方案1】:

    您可以使用jquery UI Dialog 作为弹出窗口。让我们在这里做一个小设置。

    我们会有一个主窗体的视图模型:

    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; }
    }
    

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new MyViewModel());
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            return Content("thanks for submitting");
        }
    }
    

    还有一个视图 (~/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>
    

    然后我们可以处理弹出窗口。我们为它定义一个视图模型:

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

    控制器:

    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 });
        }
    }
    

    以及对应的局部视图(~/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>
    <% } %>
    

    现在剩下的就是编写一些 javascript 来连接所有内容。我们包括 jquery 和 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>
    

    还有一个包含我们代码的自定义 javascript 文件:

    $(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;
        });
    });
    

    【讨论】:

    • 试过了,但是atm并没有弹出,而是打开了一个新页面。想知道,jquery的哪一部分触发了modal?
    • 是订阅链接的.click()事件。确保您已正确包含所有 3 个 javascript 文件(jquery-1.5.1.min.jsjquery-ui-1.8.11.jsmy.js - 包含我按此顺序显示的脚本)并且 javascript 控制台中没有错误。
    • 看到了问题,这是因为额外的 '});'哈哈!再次感谢!
    • 顺便说一句,对于后续问题,我们深表歉意。但是,我想用我添加的新值更新 x.ValueId, Model.Values) %>。返回返回 Json(new { newValue = newValue });处理?它将如何成为下拉列表的选择列表项,只是好奇。
    • 您可以在成功处理程序的下拉列表中添加一个新的&lt;option&gt; 项,而不是设置 NewValue 字段。
    【解决方案2】:
    $('#CheckGtd').click(function () {
        if ($(this).is(":checked"))
            $("#tbValuationDate").attr("disabled", false);
        else
            $("#tbValuationDate").attr("disabled", "disabled");
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 2018-03-11
      • 1970-01-01
      • 2011-06-15
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多