2015-05-10 19 views
1

我已經定義了有關帳戶的索引視圖的輸入標籤的自定義名稱在控制器的動作。名稱是iptloginPassWordiptloginPassWord。但是,在控制器中,只要點擊提交按鈕,模型將爲null鑑於模型無法綁定到ASP.NET MVC4

我附上了下面的代碼。這是模型綁定的問題嗎?你們能幫忙確定這裏有什麼問題嗎?

查看:

<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); 
    } 
} 
+0

id和name屬性是否必須是'iptloginPassWord'? – ekad

+0

是的,正確的。剃鬚刀視圖有兩個輸入標籤。iptloginPassWord和iptloginUserName都必須是ID和Name。 –

+0

您是否在視圖頂部添加了@model User? –

回答

1

您是否嘗試過定製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 
        }; 
    } 
} 

然後你需要通知新的模型綁定器的控制器動作

[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

+0

它幫助我解決這個問題。讚賞。 –

3

當你做到這一點

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

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

我不知道爲什麼你更改用戶名文本框的idname屬性iptloginUserName,但如果你從這個語法

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

刪除idname屬性並將其更改爲這個

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

model.UserName不會在你的控制器POST方法無效,它會包含用戶名文本框中輸入的值。

同樣的道理也適用於文本框的密碼,所以改變這種語法

@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" }) 
+0

是的,你是對的。默認模型綁定將使用模型的名稱來設置輸入標記的名稱。但是如果我想要執行自定義模型綁定以在輸入標記中使用自定義名稱,您是否可以幫助弄清楚如何執行此操作? –

0

如果你想使用自定義的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); 
} 
+0

但我認爲Html輔助方法與Html標記相同。 –