[英]the model in view could not bind to the action in the controller in ASP.NET MVC4
我已經在“帳戶”的“索引”視圖中定義了有關輸入標簽的自定義名稱。 名稱是iptloginPassWord
和iptloginPassWord
。 但是,在控制器中,只要單擊“提交”按鈕,模型將為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)
用戶名文本框的id
和name
屬性將自動設置為UserName
,這就是使controller.post方法中的model.UserName
值與用戶名文本框的值相同的原因。
我不確定為什么將用戶名文本框的id
和name
屬性更改為iptloginUserName
,但是如果您從此語法中刪除id
和name
屬性
@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.