【问题标题】:Getting Model content in ActionLink在 ActionLink 中获取模型内容
【发布时间】:2015-07-15 20:48:40
【问题描述】:

我有以下简单的Login-View:(只贴了相关部分)

@model  Models.LoginModel

@using (@Html.BeginForm("Login", "Account", FormMethod.Post, new { @enctype = "multipart/form-data", @class = "fm", @ReturnUrl = @ViewBag.ReturnUrl }))
{
  @Html.AntiForgeryToken()
  <h1 id="title-header">Login</h1>
  <div>
    @Html.TextBoxFor(m => m.Username, new { @maxlength = "250", @class = "username", @style = "width: 250px;" })
    @Html.ValidationMessageFor(m => m.Username)
  </div>
  <div>
    @Html.PasswordFor(m => m.Password, new { @maxlength = "250", @class = "password", @style = "width: 250px;" })
    @Html.ValidationMessageFor(m => m.Password)
  </div>
  <div>
    <input type="submit" value="Login" />            
    @Html.ActionLink("Reset PW","ResetPw","Account", new { model=Model})
  </div>   
</div>  
}

当我提交表单时,一切都很好:调用 Login-Action 并且模型包含用户名和密码。

当我点击“重置密码” - 链接时,我想实现相同但使用不同的操作。该动作被按需调用(“ResetPw()”),但模型不包含用户输入的用户名,但模型的每个字符串属性为空。

【问题讨论】:

  • 您是要链接到重置密码页面还是要提交重置密码表单?

标签: asp.net-mvc


【解决方案1】:

这是因为在用户输入用户名之前提供页面时,将评估新 { model = Model } 中的 Model。当用户名更改时,它不一定会更改。

相反,您也应该将重置密码操作设为提交输入。然后给它和登录输入相同的名称,例如submitButton。然后在 Login-Action 中你可以有一个参数string submitButton,它的值等于输入的值。然后,您可以根据值采取不同的操作。

How do you handle multiple submit buttons in ASP.NET MVC Framework

【讨论】:

  • 谢谢,使用“formaction”并将按钮设置为使用 css 的链接对我有用
【解决方案2】:

当您从服务器获取视图时,您的模型会呈现。它不会填充用户输入表单的任何数据。如果你想这样做,你应该使用js和ajax。

使用 jquery 可能是这样的:

//Your html
<input type="submit" value="Login" />        
<a id="reset-pw">Reset PW<a/>    


$(function () {
    $('#reset-pw').click(function () {
        $.ajax({
            url: @Url.Action("ResetPw","Account"),
            type: "GET", //Not sure that you use get
            data: $('form').serialize(),
            success: function (result) {
                alert('Rassword reset');
            }
        });
        return false;
    });
});

【讨论】:

    【解决方案3】:

    You can't assign a complex model to an ActionLink like that。由于您只对用户名感兴趣,因此请使用模型的该属性:

    @Html.ActionLink("Reset PW","ResetPw","Account", new { username = Model.Username })
    

    这当然假设用户首先尝试登录,因此发布到服务器,并且您的控制器返回了模型。否则它将是null,这将不起作用。

    如果您希望用户能够点击“重置密码”链接首先发回您的控制器,您将需要 JavaScript 来更改客户端点击事件处理程序中的链接。

    为了让它工作,你需要给文本框和链接一个 ID:

    @Html.TextBoxFor(m => m.Username, new { @maxlength = "250", @class = "username", @style = "width: 250px;", 
                                            id = "usernameTextbox" })
    
    @Html.ActionLink("Reset PW","ResetPw","Account", new { username = Model.Username }, new {id = "resetPasswordLink"})
    

    然后onclick,找到它,更改href 以包含在文本框中输入的值并继续:

    <script type="text/javascript">
    document.ready(function() {
        document.getElementById("resetPasswordLink").onclick = function() {
    
            var username = document.getElementById("usernameTextbox).value;
    
            // This gets rendered serverside.
            var resetUrl = '@Html.ActionLink("Reset PW", "ResetPw", "Account")';
    
            resetUrl += '?username=' + username;
    
            document.getElementById("resetPasswordLink").href = resetUrl;
        };
    );
    </script>
    

    【讨论】:

    • 无济于事。也是“空”
    • 嗯,是的,这个 CSHTML 仅在我在回答中所说的发布到服务器后才有效。如果您希望该过程是“用户输入用户名,用户意识到他们忘记了密码,用户在没有先提交表单的情况下单击“重置密码”链接,用户被重定向到“重置密码”页面并填写了他们的用户名“然后你'将需要采用 JavaScript 方法(在我的回答中也提到过),但感谢这样做的人的反对。
    猜你喜欢
    • 2021-05-21
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多