【问题标题】:ActionLink to submit Model valueActionLink 提交模型值
【发布时间】:2014-08-12 18:13:37
【问题描述】:

我希望我的 Ajax.ActionLink 将 viewModel 属性传递给操作。

这是我的视图模型

public class ViewModel
    {
        public string Searchtext { get; set; }
    }

我的 .cshtml

@Ajax.ActionLink("Bottom3", "Bottom3",new { name = Model.Searchtext}, new AjaxOptions
{
    HttpMethod = "POST",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "pointsDiv"
})

 using(Html.BeginForm("Bottom3", "Home", FormMethod.Get))
     {
         @Html.TextBoxFor(x => x.Searchtext)
         <button type="submit">Search</button>
     }
    <div id="pointsDiv"></div>
}

我的控制器操作:

public PartialViewResult Bottom3(string name)
        {
            var model = db.XLBDataPoints.OrderBy(x => x.DataPointID).Take(3).ToList();

            return PartialView("Partial1", model);
        }

但传递给动作的名称参数始终为空。我该如何解决?

【问题讨论】:

  • 您有两种方法可以在视图中发布值:ActionLink 和表单。如果您写了一些东西,表格中的 VALUE 会更新......但链接具有原始值(空)。您可以在 Searchtext 属性中设置一个默认值来测试它。
  • 选中此项以发布输入的值:stackoverflow.com/a/1148468/7720
  • @Romias:你能详细说明你的答案吗?我从您的评论中了解到有两种方法可以解决此问题,但请您简要介绍一下。

标签: ajax asp.net-mvc asp.net-mvc-5 html-helper


【解决方案1】:

在您的代码中...您有两种不同的方式发布到服务器:链接和表单按钮。

问题是 ActionLink 无法从客户端的输入中获取值...只是原始值。

如果您按下“搜索”按钮,您将看到发布的值。

现在,您可以使用一些 jQuery 来修改标准 ActionLink(不是 Ajax.ActionLink): https://stackoverflow.com/a/1148468/7720

或者...您可以转换您的表单以进行 Ajax 发布而不是普通发布: https://stackoverflow.com/a/9051612/7720

【讨论】:

  • 在你发的第二个链接中,没有action链接,他已经把它变成了提交按钮。我如何保留我的action链接。我不希望 jquery 这样做,因为我的操作链接也必须发布模型参数,我不希望 jQuery 将 ViewModel 参数发布到操作。
  • ActionLink 助手只是在创建视图期间创建一个锚点。因此,此时您无法获取用户输入的值。为此,您需要 javascript。所以,在你的情况下最好使用表格。您要发布的其他值可以隐藏在其中。
【解决方案2】:

我这样做是为了我的一个模型。我只支持 HttpPost 方法。因此,将 HttpMethod="POST" 添加到您的 Ajax.ActionLink

    [HttpPost]
    public ActionResult Accounts(ParametricAccountsModel model)
    {
        if (model.Accounts == null)
        {
            GetAccountsForModel(model);
        }
        if (model.AccountIds == null)
        {
            model.AccountIds = new List<int>();
        }
        return View(model);
    }

在剃刀视图上

@Ajax.ActionLink(
        "Add Account to Order", "Accounts", "Parametric", null,
        new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = "...", HttpMethod = "POST" },
        new { @id = "AddParametricAccountLink" })  

该模型有一个选定帐户 ID 的列表。所以在javascript中,我动态修改了action链接的href。

function UpdateParametricAccountAction() {
    var originalLink = '/TradeNCashMgmt/Parametric/Accounts';
    var append = '';
    var numberOfRows = $('#ParametricAccounts').find('.parametric-account-  row').size();
    for (var i = 0; i < numberOfRows; i++) {
        if (i != 0) {
            append += '&';
        }
        else {
            append = '?';
        }
        var idValue = $('#NotionalTransactionsAccountId_' + i).val();
        append += 'AccountIds%5B' + i + '%5D=' + idValue;
    }

    $('#AddParametricAccountLink').attr('href', originalLink + append);
}

由于模型绑定器在查询字符串和表单提交中查找参数名称,因此它将使用 href 获取值。因此,我使用 Ajax.ActionLink 上的查询字符串发布了一个模型对象。不是最干净的方法,但它有效。

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 2012-11-07
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多