2012-11-28 203 views
1

我正在開發一個MVC 4網站。MVC 4多模型綁定

在我的網站中,我有一個局部視圖中的登錄表單,並將其呈現在_layout.cshtml中,它使用LoginModel

我也有一個接觸的形式,它使用ContactModel

當我到聯繫表格,並提交一切都很好。它到了服務器端。它執行我返回一個視圖並將其綁定到ContactModel

此後很簡單:

[HttpPost] 
public ActionResult Contact(Contact model) 
{ 
    if (ModelState.IsValid) 
    { 
     //somecode here 
    } 

    return View(model); 
} 

這是越來越複雜和MVC試圖綁定ContactModel到登錄頁面,並提供了以下錯誤

傳入字典的模型項目類型爲 'My_Project.Model.ContactModel',但該字典需要型號爲'My_Project.Models.LoginModel'的 項目。

我的聯繫表格視圖:

@model My_Project.Model.ContactModel 
@{ 
    ViewBag.Title = "Contact"; 
} 

     @using (Html.BeginForm("Contact", "Home", FormMethod.Post, new { id = "formContact" })) 
     { 
      @Html.ValidationSummary(true) 
      @Html.TextBoxFor(model => model.Name, new {@class = "c2inp1", @placeholder = "Name"}) 
      @Html.ValidationMessageFor(model => model.Name) 
      <br/> 
      @Html.TextBoxFor(model => model.Surname, new {@class = "c2inp2", @placeholder = "Surname"}) 
      @Html.ValidationMessageFor(model => model.Surname) 
      <br/> 
      @Html.TextBoxFor(model => model.Email, new {@class = "c2inp2", @placeholder = "Email"}) 
      @Html.ValidationMessageFor(model => model.Email) 
      <br/> 
      @Html.TextAreaFor(model => model.Message, new { @class = "c2inp3", @placeholder = "Message" }) 
      @Html.ValidationMessageFor(model => model.Message) 
      <br/>    
      <input type="image" src="@Url.Content("~/Images/c2img4.png")" alt="" class="c2submit"/> 
     } 
    </div> 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

我的局部視圖登錄表單

@model My_Project.Model.LoginModel 

@{ 
    ViewBag.Title = "Log in"; 
} 
@if (WebSecurity.IsAuthenticated) 
{ 
    <hgroup class="title"> 
    <h1>@ViewBag.Title.</h1> 
</hgroup> 

    <section id="loginForm"> 
<h2>Use a local account to log in.</h2> 
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Log in Form</legend> 
     <ol> 
      <li> 
       @Html.LabelFor(m => m.UserName) 
       @Html.TextBoxFor(m => m.UserName) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Password) 
       @Html.PasswordFor(m => m.Password) 
       @Html.ValidationMessageFor(m => m.Password) 
      </li> 
      <li> 
       @Html.CheckBoxFor(m => m.RememberMe) 
       @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" }) 
      </li> 
     </ol> 
     <input type="submit" value="Log in" /> 
    </fieldset> 

} 
</section> 


</section> 
} 

在我_layout.cshtml即時渲染登錄表單

@Html.Partial("_LoginPartial") 

我怎樣才能解決這個問題?

+0

你能否提供一些更多的信息,如視圖代碼?你能否告訴我們該方法屬於哪個控制器? –

+0

也是在視圖上返回部分或全部的動作? – Jared

回答

1

您需要指定要傳遞到_layout.cshtml查看登錄視圖模型...

例子:

@Html.Partial("_yourloginview", new LoginModel()) 
+0

非常感謝里卡多:)它完美運作 – ergunysr

0

您傳遞給視圖的數據類型應與您在視圖內聲明的模型一致。比如像這樣:

public ActionResult SomeDerp() 
{ 
    Derp derp = new Derp(); 
    return View(derp); 
} 

然後認爲應該對SomeDerp頁,也許像這樣的頂部聲明的模型:

@model Derp 

很抱歉,如果我雖然誤解你的問題: )

+0

感謝您的回答,但我已經在做。這不是我確切的問題:) – ergunysr

+0

aaa ok ....但是你的ActionResult返回View()或PartialView()? – gardarvalur

0

原因是因爲在您的_layout.cshtml中指定了登錄模型,因此每個頁面現在也都需要此模型。