基于DropDownList的值和模型调用Action方法 - javascript

我的视图中有一个下拉列表。我需要使用户能够从下拉列表中选择一个值,然后单击按钮/ ActionLink以在同一控制器中调用另一个动作方法。需要传递给新ActionMethod的值是从下拉列表中选择的Value的ID,以及传递给View的模型的ID。模型和下拉列表未通过任何方式链接在一起。

我尝试过onchnage = document.location.href设置操作方法的路径,并将单个值传递给操作方法。但是document.location.href的问题是它将URL附加到现有的URL上,这是无法理解的。也就是说,最终的URL竟然是localhost:port/controller1/action1/controller1/action2,应该只是localhost:port/controller1/action2

我正在寻找一种无需使用javascript就可以完成的方法,因为我已经尝试过了。

视图中的代码

@using (Html.BeginForm("Copy","SetValues",FormMethod.Post))
{
    <p>
        @Html.DropDownList("OptionValueID", null, "Select")
        <input type="submit" value="Copy" />

        //This is the preferable method though
        @*@Html.ActionLink("Copy", "Copy", "SetValues", new { @OptionValueID = @ViewBag.id,@CopyID = CopyDDL.SelectedValue},null)*@
    </p>
}

复制函数将使用两个参数:Id of the selected itemID that is being passed through ViewBag.id

由View返回的View将是另一个View

我尝试过的JavaScript

<script language="javascript" type="text/javascript">
    function copy(_OptionValueID)
    {
        var url = "/SetValues/Copy";
        $.ajax({
            url: url,
            data: { copyid: _OptionValueID},
            type: "POST",
            success: function (data) { }


        });
        response();
    }
</script>

它根本没有评估。

调用此视图的操作方法

public ActionResult Index(int id)
{
        var ov = db.OptionValue.Include(x => x.Option).FirstOrDefault(x => x.OptionValueID == id);
        var opid = ov.OptionID;
        var op = db.Option.Include(x => x.TechnicalCharacteristic).FirstOrDefault(x => x.OptionID == opid);
        var tcid = op.TechnicalCharacteristicID;
        var tc = db.TechnicalCharacteristic.Include(x => x.TcSets).FirstOrDefault(x => x.TechnicalCharacteristicID == tcid);
        var tcset = tc.TcSets;
        var opv = db.OptionValue.FirstOrDefault(x => x.OptionValueID == id);
        ViewBag.OptionValue = opv.OptionVal;
        ViewBag.Option = opv.Option.OptionName;
        ViewBag.Lsystem = opv.Option.Lsystem.LsystemName;
        ViewBag.FamilyName = opv.Option.Lsystem.LsystemFamily.FamilyName;
        ViewBag.OptionValID = id;
        ViewBag.OptionID = opv.OptionID;
        var setValue = db.SetValue.Where(x=>x.OptionValueID==id).OrderBy(x=>x.TcSet.SetName);
        ViewBag.OptionValueID = new SelectList(db.OptionValue.Where(x=>x.OptionID==opid), "OptionValueID", "OptionVal");
        return View(setValue.ToList());
}

我已经检查了与此有关的大多数问题,但是没有一个人不使用模型就传递两个参数的开销。

更新:使其更加清晰

 public ActionResult copy(int OptionValueID,int CopyID)
 {
     //do Something
     return View("Error");
 }

以上是复制方法

OptionValueID = ViewBag.OptionValID //Got from the Action Method Index of SetValues
CopyID = Value from the DropDownlist

根据答案进行编辑

@using (Html.BeginForm("Copy","SetValues",FormMethod.Post))
{
    <p>
        @Html.DropDownList("CopyID", null, "Select")
        <button type="submit" id="Copy" data-id="@ViewBag.OptionValID"> Copy </button>
    </p>
}

现在页面正在重定向,但没有参数正在传递。我应该添加路由值吗?

参考方案

没有JavaScript,您将无法做到。 ActionLink()方法在发送到客户端之前已在服务器上进行了解析,因此任何路由值都是控制器中的初始值,而不是用户在视图中进行的任何编辑后的值。为了响应客户端事件,您需要使用javascript。

您可以使用ajax将值发布到服务器方法。

包含一个按钮并处理其单击事件

<button type="button" id="Copy" data-id="@ViewBag.id">Copy</button>

脚本

var url = '@Url.Action("Copy", "SetValues")';
$('#Copy").click(function() {
  var optionID = $(this).data('id');
  var copyID = $('#OptionValueID').val();
  $.get(url, { OptionValueID: optionID, copyID : CopyID }, function(response) {
    // do something with the response
  });
});

或者,如果您要重定向,则将$.get()替换为

location.href = url + '?OptionValueID=' + optionID + '&CopyID=' + copyID;

编辑

根据修改后的问题和评论,如果要发布和重定向,则不需要任何JavaScript或链接。下拉列表必须为@Html.DropDownList("CopyID", null, "Select"),以便将其选择的值绑定到方法参数int CopyID,并且由于未编辑OptionValueID,因此可以将其值添加为以下形式的路由参数

@using (Html.BeginForm("Copy", "SetValues", new { OptionValueID = ViewBag.OptionID }, FormMethod.Post))

或为该值添加隐藏的输入

<input type="hidden" name="OptionValueID" value="@ViewBag.OptionID" />

html onClick打开url存储在php变量中 - javascript

以下是我的代码,正在获取Uncaught SyntaxError: Unexpected token },但是我的代码中没有看到任何}。 window.open期望用引号引起来的url,我尝试了单引号和双引号的不同组合,但不起作用并且也无法在echo中转义双引号。请帮助谢谢..<?php $a = "https://www.google.co…

javascript popupwindow之后的行如何工作? - javascript

好的,我有一个来自后面代码的方法,可以创建一个popupwindow。然后有一行代码要在那之后执行,我想知道那行代码何时执行,是在使用popupwindow之后执行还是在创建popupwindow之后执行?例如:void exPopupWindowMethod() { string scr = "window.open('exampleP…

使用C#执行JavaScript页面 - javascript

我正在尝试使用C#抓取一个网站。在此过程中的某个时候,网站返回了我需要执行的JavaScript页面,以便它将生成一些参数,然后使用所生成的参数作为查询变量来发布请求。这是JavaScript文件https://jsfiddle.net/7aw5vr59/浏览器生成的结果文件如下所示:<imimxxxyyy id="ActiveX"…

Javascript-Urls的奇怪字符串比较行为 - javascript

最近,在编写我无法理解的javascript时遇到了字符串比较的问题。我从完全相同的网址创建了两个字符串,当我比较它们时返回false,但是在重新分配相同的字符串后,比较返回true。这是我的示例:var str1 = "http://google.com/"; var str2 = "http://google.com‏/&#…

HTML Action ID获取方法 - javascript

这可能已经是另一个问题的副本,但我找不到它。我采取了以下行动:<form id="bug-form" action="/AST_14/Bugg.ly2/index.php/bug/update/" method="post"> 现在,我的系统的工作方式是每个需要更新的“错误”都有自己的错…