2012-01-15 8 views
1

ログインボックス(部分表示)を持つ_レイアウトページがあり、そのビューには独自のモデルがあります。だから、コントローラは次のようになります。MVC3複数モデル - シングルページ

 public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(LoginModel loginModel) 
    { 
     if(ModelState.IsValid) 
     { 
      var g = new GallaryImage(); 
      var user = g.LoginUser(loginModel.Username, loginModel.Password); 
      if(user != null) 
      { 
       FormsAuthentication.SetAuthCookie(user.username, false); 
       return RedirectToAction("Index", "Home"); 
      } 
      ModelState.AddModelError("", "Invalid Username/Password"); 
     } 
     return View(loginModel); 
    } 

しかし、すぐに私のメインのコンテンツページログインボックスがLoginModelタイプを想定しているため、私のWebアプリケーションに障害が発生し、モデルを必要としますが、私のコンテンツページが別のモデルを送っているよう:

これは私のメインのインデックス画面のためのGETメソッドである:だから

public ActionResult Index() 
    { 
     IndexModel model = new IndexModel(); 
     var g = new GallaryService.GallaryImage(); 
     var i = g.GetRandomImage(); 

     if (i != null) 
      model.RandomImageUrl = "~/Images/Watermarks/" + i.filename; 
      return View(model); 
    } 

、私のメインのコンテンツページにはIndexModelを持っていますが、私の部分図でLoginModelを持っています。

"辞書に渡されたモデルアイテムは 'GalleryPresentation.Models.IndexModel'タイプですが、この辞書には 'GalleryPresentation.Models.LoginModel'タイプのモデルアイテムが必要です。 "

どうすれば処理できますか?_layoutにはログインボックスのモデルが必要です。

リクエストに応じて、ここにはLoginboxのcshtmlファイルがあります。

@using GalleryPresentation.Models 
@model LoginModel 

<script src="../../Scripts/jquery.validate.min.js" type="text/javascript"></script> 
@using (Html.BeginForm("index", "Account", FormMethod.Post)) 
{ 
    <table class="smallBox"> 
     <tr> 
      <td>@Html.LabelFor(m => m.Username)</td> 
      <td>@Html.TextBoxFor(m => m.Username, new { @class = "smallText" })</td> 
      <td>@Html.LabelFor(m => m.Password)</td> 
      <td>@Html.PasswordFor(m => m.Password, new { @class = "smallText" })</td> 
     </tr> 
     <tr> 
      <td colspan="4" align="right"><input type="submit" value="Login"/></td> 
     </tr> 
     <tr> 
      <td colspan="2">@Html.ValidationSummary()</td> 
     </tr> 
    </table> 

} 

とIndex.cshtmlファイル(メインのコンテンツ画面)は、これを持っている。このような

@using GalleryPresentation.Models 
@model IndexModel 
@{ 
    ViewBag.Title = "Craig and Melanie's Digital Moments"; 
} 

<br/> 
<div style="text-align: center"> 
    <img src="@Url.Content(Model.RandomImageUrl)" alt="@ViewBag.Title" /> 
</div> 
+0

部分ログインボックスを含めてくださいビューcshtml。 –

+0

@Phil - コードを追加しました。 – Craig

+0

他のすべてのモデルのベースクラスとしてLoginModelを使用して継承できるようですか?それはうまくいくようですが、それは良いデザイン/実践ですか?私はすべてのモデルがLoginModelから継承していることを保証する必要があります(これはBaseModelに名前を変更すると思います。 – Craig

答えて

1

質問は常に簡単な解決策がないので、お答えするのが最も簡単ではありません。考慮すべきいくつかの問題があります。可能であれば、別のビューでログインの検証エラーを処理することをお勧めします。小さなログインボックスの部分ビューには、厳密に型指定されたビューモデルは必要ありません。

完璧な解決策はありませんが、_Layoutに依存するビューをレンダリングするすべての要求に対して常にLoginModelオブジェクトを作成することは、多くの意味があるとは思いません。以下の解決策は、明示的なログイン試行とログイン失敗の処理に使用できる別のログインビューの作成を推奨しています。

これに続く問題がある場合は、コメントでご質問ください。私は答えに全力を尽くします。

ログインボックス

@using (Html.BeginForm("Index", "Account")) 
{ 
    <table class="smallBox"> 
     <tr> 
      <td>Username</td> 
      <td>@Html.TextBox("Username", new { @class = "smallText" })</td> 
      <td>Password</td> 
      <td>@Html.Password("Password", new { @class = "smallText" })</td> 
     </tr> 
     <tr> 
      <td colspan="4" align="right"><input type="submit" value="Login"/></td> 
     </tr> 
    </table> 
} 

アカウント・コントローラ

public ActionResult Login() 
{ 
    return View(); 
} 

public ActionResult RetryLogin() 
{ 
    ModelState.AddModelError(null, "The Username or Password you entered is invalid. Please try again."); 
    return View("Login"); 
} 

[HttpPost] 
public ActionResult Index(LoginModel loginModel) 
{ 
    if(ModelState.IsValid) 
    { 
     var g = new GallaryImage(); 
     var user = g.LoginUser(loginModel.Username, loginModel.Password); 
     if(user != null) 
     { 
      FormsAuthentication.SetAuthCookie(user.username, false); 
      return RedirectToAction("Index", "Home"); 
     } 

     ModelState.AddModelError("", "Invalid Username/Password"); 
    } 

    return RedirectToAction("RetryLogin"); 
} 

ログインビュー

@using (Html.BeginForm("Index", "Account")) 
{ 
    @Html.ValidationSummary() 
    <!-- login form here --> 
} 
+0

素晴らしい答えのように見えます。私はLoginboxが_レイアウトにどのように適合しているのか理解していません - あるいは、Loginboxが_layoutになくなったと言っているのですか?それは別のログイン画面ですか? – Craig

+0

私はあなたが_layoutで使用される部分的なビューと/ Account/Loginのシナリオを扱う完全なビューの両方を持っていることをお勧めします。その時点での部分的な見方は本当に必要ではないかもしれませんが、それを分割することはまだ役立つかもしれません。 –

関連する問題