簡體   English   中英

視圖中的模型無法綁定到ASP.NET MVC4中控制器中的操作

[英]the model in view could not bind to the action in the controller in ASP.NET MVC4

我已經在“帳戶”的“索引”視圖中定義了有關輸入標簽的自定義名稱。 名稱是iptloginPassWordiptloginPassWord 但是,在控制器中,只要單擊“提交”按鈕,模型將為null

我已經附上了下面的代碼。 這是模型綁定問題嗎? 你們可以幫忙確定這里出了什么問題嗎?

視圖:

<div class="rl-modal-body">
    <div class="login-model-body-wrap">
        @using (Html.BeginForm("Logon", "Account", FormMethod.Post, new { id = "loginForm" }))
        {
            <div class="rlf-model-group">
                <div class="ipt-container">
                    <div class="ipt-config ipt-UserName"></div>
                    @*h5提供了required屬性,Name的N必須為大寫*@
                    @*<input id="iptloginUserName" type="text" name="iptloginUserName" value="" placeholder="請輸入用戶名" class="ipt ipt-login" required="required" />*@
                    @Html.TextBoxFor(model => model.UserName, new { @id = "iptloginUserName", @Name = "iptloginUserName", @placeholder = "請輸入用戶名", @class = "ipt ipt-login", @required = "required" })
                </div>
                <p class="rl-p"></p>
            </div>
            <div class="rlf-model-group">
                <div class="ipt-container">
                    <div class="ipt-config ipt-Password"></div>
                    @*<input id="iptloginPassWord" type="password" name="iptloginPassWord" value="" placeholder="請輸入密碼" class="ipt ipt-login ipt-passwordforJS" required="required" />*@
                    @Html.PasswordFor(model => model.Password, new { @id = "iptloginPassWord", @Name = "iptloginPassWord", @placeholder = "請輸入密碼", @class = "ipt ipt-login ipt-passwordforJS", @required = "required" })
                </div>
                <p class="rl-p"></p>
            </div>
            <div class="rlf-model-group">
                <label for="AutoLogin">
                    <input id="AutoLogin" type="checkbox" checked="checked" />自動登錄
                </label>
            </div>
            <div class="rlf-model-group">
                <p class="rl-p"></p>
                <input id="iptloginsubmit" type="submit" name="Button" value="登錄" class="btn-red btn-full" />
            </div>
        }
    </div>
</div>


控制器:

 public class AccountController : Controller { // // GET: /Account/ [AllowAnonymous] public ActionResult Index() { return View(); } [AllowAnonymous] [HttpPost] public ActionResult Logon(User model) { string username = model.UserName;//this will get null string password = model.Password;//this will also get null return View(model); } } 

當你這樣做

@Html.TextBoxFor(model => model.UserName)

用戶名文本框的idname屬性將自動設置為UserName ,這就是使controller.post方法中的model.UserName值與用戶名文本框的值相同的原因。

我不確定為什么將用戶名文本框的idname屬性更改為iptloginUserName ,但是如果您從此語法中刪除idname屬性

@Html.TextBoxFor(model => model.UserName, new { @id = "iptloginUserName", @Name = "iptloginUserName", @placeholder = "請輸入用戶名", @class = "ipt ipt-login", @required = "required" })

並將其更改為此

@Html.TextBoxFor(model => model.UserName, new { @placeholder = "請輸入用戶名", @class = "ipt ipt-login", @required = "required" })

model.UserName在控制器發布方法中不會為null,它將包含在用戶名文本框中輸入的值。

密碼文本框也是如此,因此請更改此語法

@Html.PasswordFor(model => model.Password, new { @id = "iptloginPassWord", @Name = "iptloginPassWord", @placeholder = "請輸入密碼", @class = "ipt ipt-login ipt-passwordforJS", @required = "required" })

對此

@Html.PasswordFor(model => model.Password, new { @placeholder = "請輸入密碼", @class = "ipt ipt-login ipt-passwordforJS", @required = "required" })

您是否嘗試過Custom ModelBinder?

public class MyCustomModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, 
                            ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;

        string username = request.Form.Get("iptloginUserName");
        string password = request.Form.Get("iptloginPassWord");

        return new User
                   {
                       UserName = title,
                       Password = password
                   };
    }
} 

然后,您需要通知控制器新ModelBinder的操作

[HttpPost]
    public ActionResult Index([ModelBinder(typeof(MyCustomModelBinder))] User home)
    {
        //use model here 
        return View();
    }

詳細信息: http : //codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder

如果要使用自定義ID,請從視圖中取消注釋以下行

@*<input id="iptloginUserName" type="text" name="iptloginUserName" value="" placeholder="請輸入用戶名" class="ipt ipt-login" required="required" />*@

@*<input id="iptloginPassWord" type="password" name="iptloginPassWord" value="" placeholder="請輸入密碼" class="ipt ipt-login ipt-passwordforJS" required="required" />*@

並更新方法標題

[AllowAnonymous]
[HttpPost]
public ActionResult Logon(User model, string iptloginUserName, string iptloginPassWord)
{
    model.UserName= iptloginUserName;
    model.Password = iptloginPassWord;

    return View(model);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM