【问题标题】:ASP.NET MVC5 Razor Refresh modal dialogASP.NET MVC5 Razor 刷新模式对话框
【发布时间】:2017-12-04 09:57:37
【问题描述】:

每次用户按下“订单”按钮时,我都会尝试在模式对话框中获取实际时间。

<a class="btn btn-primary" data-toggle="modal" data-target="#OrderModal">@MEDONET.Language.Doctor.Texts.Order</a>

所以每次他在模态 div OrderModal 中执行此操作

<div id="OrderModal" class="modal fade" role="dialog">
    @Html.Action("CreateOrderForm", Model.CreateOrderVM)
</div>

调用 CreateOrderForm 操作

public ActionResult CreateOrderForm(CreateOrderVM createOrderVM)
    {
        createOrderVM.Minute = DateTime.Now.Minute.ToString().PadLeft(2, '0');
        return View("CreateOrderForm", createOrderVM);
    }

因此该操作实际上每次都在运行并调用 CreateOrderForm.cshtml 文件

@{
Layout = null;
}
@model MEDONET.Models.CreateOrderVM

<div class="modal-dialog modal-sm">
<!-- Modal content-->
<div class="modal-content">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">&times;</button>
        <h4 class="modal-title text-center">Order To Line</h4>
    </div>
    <div class="modal-body">
        @using (Html.BeginForm("CreateOrder", "Doctors", FormMethod.Post))
        {
            @Html.AntiForgeryToken()
            @Html.HiddenFor(m => m.DoctorId)
            <div class="row text-center">
                <p>Date & Time</p>
                @Html.Label("Year")
                @Html.EditorFor(model => model.Year, new { htmlAttributes = new { @class = "form-control", @Value = DateTime.Now.Year } })<br />
                @Html.Label("Month")
                @Html.EditorFor(model => model.Month, new { htmlAttributes = new { @class = "form-control", @Value = DateTime.Now.Month } })<br />
                @Html.Label("Day")
                @Html.EditorFor(model => model.Day, new { htmlAttributes = new { @class = "form-control", @Value = DateTime.Now.Day } })<br />
                @Html.Label("Hour")
                @Html.EditorFor(model => model.Hour, new { htmlAttributes = new { @class = "form-control", @Value = DateTime.Now.Hour } })<br />
                @Html.Label("Minute")
                @Html.EditorFor(model => model.Minute, new { htmlAttributes = new { @class = "form-control" } })<br />
                @if (this.User.IsInRole("Registrator"))
                {
                    @Html.EditorFor(model => model.PhoneNumber, new { htmlAttributes = new { @class = "form-control" } })<br />
                }
                <button type="submit" class="btn btn-default">Submit</button>
            </div>
        }
    </div>
    <div class="modal-footer">

    </div>
</div>

但是!弹出字段仍然填充父页面加载时给出的第一次。

如何在用户每次按下订单按钮时​​给他新的时间?

【问题讨论】:

  • 每次单击按钮时调用该方法的代码在哪里? (@Html.Action("CreateOrderForm", Model.CreateOrderVM) 只是在您第一次渲染页面时调用它)
  • 附带说明,在使用 HtmlHelper 方法时,切勿设置 value 属性 - 您设置绑定到的属性的值。
  • 另外,应该有[HttpGet][HttpPost]修饰的方法吧?
  • 是的,就是post的动作 [HttpPost] [ValidateAntiForgeryToken] public ActionResult CreateOrder(CreateOrderVM createOrderVM) { *** }
  • 我尝试从 javascript 调用它。它确实有效,每次我按下按钮时它都会调用动作并且动作会更改模型,但字段继续保持旧值。我的意思是分钟。 $.ajax({ url: '@Url.Action("CreateOrderForm","Doctors")', error: function (xhr, ajaxOptions, thrownError) { //some errror, some show err msg to user and log the error alert(xhr.responseText); } });

标签: javascript jquery asp.net asp.net-mvc razor


【解决方案1】:

Razor 代码仅在第一次加载页面时执行一次。之后,每次切换模式弹出窗口时,它只会显示/隐藏相同的 HTML。解决方案是在单击按钮打开模态框后更新 HTML。您可以使用 JQuery 的load() 方法来实现这一点。

首先你需要使用 JavaScript 来切换 Modal 而不是 HTML。如下修改您的按钮

<a class="btn btn-primary" id="openModal">@MEDONET.Language.Doctor.Texts.Order</a>

在 JavaScript 中,为该按钮添加事件处理程序,如下所示

$('#openModal').on('click', function() {
  ...
})

然后,加载子动作的内容。

$('#openModal').on('click', function() {
  $("#OrderModal").load("@Url.Action("CreateOrderForm", "ControllerName")", function() {
    $('#OrderModal').modal('show')
  });
})

我还没有测试过上面的代码,它可能需要一些错字更正。如果它不起作用,请告诉我。

【讨论】:

  • 我这样做了&lt;script&gt; $('#openModal').on('click', function() { $("#OrderModal").load("@Url.Action("CreateOrderForm", "Doctors")", function() { $('#OrderModal').modal('show') }); }),但是当我按下&lt;a class="btn btn-primary" id="openModal"&gt;@MEDONET.Language.Doctor.Texts.Order&lt;/a&gt; 时,什么都没有发生
  • 你能像这样把双引号改成单引号吗'@Url.Action("CreateOrderForm", "Doctors")'
  • 是的!谢谢!它有效))我设置了单引号,以这种方式添加了onclick方法:&lt;a class="btn btn-primary" id="openModal" onclick="myFunction()"&gt;@MEDONET.Language.Doctor.Texts.Order&lt;/a&gt;并更改了功能:function myFunction() { // $('#OrderModal #Minute').val(new Data().getMinutes()); $("#OrderModal").load('@Url.Action("CreateOrderForm", "Doctors")', function () { $('#OrderModal').modal('show') }); }
  • 我想这样做,但做不到 :( 我还没有获得 15 声望这样做。对不起
  • @AzizjanHamidovichAyupov,您可以通过单击答案旁边的勾号来接受答案! - What should I do when someone answers my question? - 你不需要任何代表来接受答案。
【解决方案2】:

我猜该方法使用某种帖子,然后返回新表单。 在这种情况下,当您返回相同的视图时,模型状态就是填充这些字段的状态。为了解决它添加动作

ModelState.Clear();

或者

ModelState.Remove("myChangeValue");

您可以在https://blogs.msdn.microsoft.com/simonince/2010/05/05/asp-net-mvcs-html-helpers-render-the-wrong-value/寻找更多信息

如果您只想更改模式中的时间,我建议您在显示模式时使用 javascript 更改它。

$('#OrderModal #Minute').val(new Data().getMinutes());

【讨论】:

  • 我认为它应该可以工作...如何将 id 添加到我的 Html.EditorFor 中?
  • 如果您指的是第一部分,那么只有当您有发布请求时。在第二个中,您需要在显示“模态”时添加此行。 (查找编辑器ID:通常是编辑器,模型链由“_”分隔,您可以使用元素检查器查看)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多